我们使用hibernate作为DAO层时,有时会遇到如下错误:
org.hibernate.QueryException: duplicate association path: agent
duplicate association
具体是什么错误呢?
Criteria criteria=this.inspectionOrderDao.createCriteria(); criteria.createCriteria("agent").add(Restrictions.eq("type", 1));//不报错 criteria.createCriteria("agent").add(Restrictions.eq("enable", 1));//报错:duplicate association
上面的代码就会报错.
实际代码结构及业务肯定比上述要复杂,
即设置条件不在一个方法里面.
如果出现这种异常就会直接导致接口报错,导致服务不可用.
如何解决 呢?
实际上我们有办法判断 Criteria 中是否已经存在了子查询路径:
public static SubCriteriaDto isSubcriteriaContains(Criteria criteria, String associationPath) { CriteriaImpl criteria2 = (CriteriaImpl) criteria; return isSubcriteriaContains(criteria2, associationPath); } /*** * 解决org.hibernate.QueryException: duplicate association path: community * @param criteria2 * @param associationPath * @return */ public static SubCriteriaDto isSubcriteriaContains(CriteriaImpl criteria2, String associationPath) { Iterator<CriteriaImpl.Subcriteria> subcriteriaIterator = criteria2.iterateSubcriteria(); SubCriteriaDto subCriteriaDto=new SubCriteriaDto(); while (subcriteriaIterator.hasNext()) { CriteriaImpl.Subcriteria subcriteria = subcriteriaIterator.next(); String path = subcriteria.getPath(); System.out.println("path :" + path); if (path.equals(associationPath)) { subCriteriaDto.setContains(true); subCriteriaDto.setSubCriteria(subcriteria); return subCriteriaDto; } } return subCriteriaDto; }
应用:
public void condition(Field field, Object entityProp) { Integer id = ReflectHWUtils.getObjectIntValue(entityProp, Constant2.DB_ID); if (null == id || id == SystemHWUtil.NEGATIVE_ONE) { //解决Caused by: org.hibernate.PropertyAccessException: IllegalArgumentException occurred calling getter of oa.entity.HouseInfo.address //没有执行createAssiate() // criteria.createCriteria(key).add(getExample(value, false, isLike)); String associationPath = field.getName(); SubCriteriaDto subCriteriaDto=ConditionQueryUtil.isSubcriteriaContains(this.criteria, associationPath); if (subCriteriaDto.isContains()) {//已经存在该路径的子查询 subCriteriaDto.getSubCriteria().add(Example.create(entityProp)); } else { this.criteria.createCriteria(associationPath).add(Example.create(entityProp)); } } else { eq(field.getName() + ".id", id); } }
附上SubCriteriaDto结构:
package oa.bean; import org.hibernate.internal.CriteriaImpl; public class SubCriteriaDto { private boolean isContains; private CriteriaImpl.Subcriteria subCriteria; public boolean isContains() { return isContains; } public SubCriteriaDto setContains(boolean contains) { isContains = contains; return this; } public CriteriaImpl.Subcriteria getSubCriteria() { return subCriteria; } public SubCriteriaDto setSubCriteria(CriteriaImpl.Subcriteria subCriteria) { this.subCriteria = subCriteria; return this; } }
相关推荐
### Altium Designer中“Duplicate Net Names Wire”错误的终极解决办法 #### 一、问题概述 在使用Altium Designer进行电路设计过程中,遇到“Duplicate Net Names Wire”这一类错误是较为常见的现象。这类错误通常...
Outlook Duplicate Items Remover是一款专为Microsoft Outlook设计的工具,旨在帮助用户解决电子邮件、联系人、日历项、任务和笔记等重复数据的问题。在Outlook中,由于各种原因(如手动复制、同步错误或软件故障)...
本文将详细介绍如何通过一个名为`react_gradle`的自定义脚本来解决`duplicate_file`问题,并讨论与之相关的`jenkins`自动化构建。 首先,我们来看标题中的`react_gradle`,这是针对React Native项目的特定Gradle...
"Duplicate Cleaner Pro"就是这样一款专为解决此问题而设计的专业软件,它以其强大的功能和易用性,成为了许多用户的选择。 Duplicate Cleaner Pro 提供了多种条件的文件查询功能,这使得用户可以根据自己的需求...
Duplicate Cleaner Pro 3.2.6 破解版
### ORACLE RMAN DUPLICATE 数据库复制详解 #### 概述 在Oracle环境中,通过RMAN(Recovery Manager)工具可以高效地复制整个数据库。本文将详细介绍如何利用RMAN的`DUPLICATE`命令来实现数据库的复制,并针对两种...
FirmTools Duplicate Photo Finder是一款整理图像的必备工具,它使用高级搜索算法,会快速在您的硬盘或指定文件夹中找到重复或相似的图像,需要的朋友快来下载吧。 FirmTools Duplicate PhotoFinder 使用了先进的...
Duplicate File Cleaner是一款功能强大的重复文件清理工具,它能够帮助用户扫描并识别计算机上所有重复的文件,从而节省磁盘空间,提升系统性能。 ### 软件概述 Duplicate File Cleaner的主要功能包括但不限于: ...
duplicate cleaner pro 破解版 4.0.5 。安装后,将第二步的x86及x64目录下的文件拷贝到安装目录下的x86与x64下。然后启动,输入长一点的序列号(随便输入字符),即可破解。
FirmTools Duplicate Photo Finder 相似图像查询软件 你电脑中如果有很多图像,有很多可能是一个logo只差,你用其他md5检测软件是不能快速找出来的。这个软件可以搜索相似的图像,你查看后选择删除,非常的方便。 ...
【Duplicate Cleaner v2.04】是一款高效实用的免费软件,专为用户解决电脑中重复文件堆积的问题。这款工具能够帮助用户快速扫描、识别并删除重复的文件,从而释放宝贵的磁盘空间,优化电脑性能。 在当今数字时代,...
Oracle DataGuard是一种高可用性和灾难恢复解决方案,它能够保护数据免受逻辑和物理故障的影响。DataGuard通过创建并维护一个或多个备用数据库来实现这一点,这些备用数据库可以是物理副本、快照副本或是只读副本。...
Oracle 11gR2 使用 RMAN duplicate from active database 复制数据库 Oracle 11gR2 中使用 RMAN duplicate from active database 复制数据库是一种高效的数据库复制方法。这种方法可以直接从活动数据库复制,省去...
文件去重Duplicate Cleaner Pro v3.24专业破解版 Duplicate Cleaner 是一款可以帮助你在你的计算机上找到并且清除副本文件的简单易用的软件。你可以立即搜索多个文件夹结构并且设置识别副本文件的标准。你可以选择...
Duplicate Picture Finder 1.0.5.10汉化版正是为了解决这个问题而设计的,它是一款专用于查找并管理重复图片的工具。 这款软件的核心功能是查找完全相同的图片以及相似的图片。它采用了先进的图像比对算法,能够在...
为了有效地解决这个问题,"Alike Duplicate Image Finder 2.2 绿色版"应运而生,它是一款专为用户设计的高效、便捷的重复图片查找工具。 首先,我们来了解一下"Alike"的核心功能。该软件的主要目标是帮助用户快速...
Duplicate File Finder单文件
Duplicate cleaner pro v3.2.7crack
Extended Duplicate则为这些问题提供了解决方案。 首先,该插件允许用户在复制对象时保留其原有的父层级关系,这意味着你可以快速创建一系列关联的对象,如骨骼系统、模拟群组等,而无需手动重新设置每个副本的父子...
### Oracle RMAN DUPLICATE 教程详解 #### 一、RMAN Duplicate 概述 **RMAN (Recovery Manager)** 是 Oracle 数据库管理系统中的一个重要工具,用于管理数据库的备份、恢复以及灾难恢复策略。其中,**Duplicate** ...