我们使用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 Desiigner Duplicate Net Names Wire XXX的终极解决办法 Multiple Top Level Documents
解决duplicate_file的自定义脚本react.gradle文件,替换目录.\node_modules\react-native\react.gradle文件即可
FirmTools Duplicate Photo Finder 相似图像查询软件 你电脑中如果有很多图像,有很多可能是一个logo只差,你用其他md5检测软件是不能快速找出来的。这个软件可以搜索相似的图像,你查看后选择删除,非常的方便。 ...
duplicate cleaner pro 破解版 4.0.5 。安装后,将第二步的x86及x64目录下的文件拷贝到安装目录下的x86与x64下。然后启动,输入长一点的序列号(随便输入字符),即可破解。
duplicate绝对干货。利用duplicate复制数据库,文档中包换每一步的试验步骤,详细说明了每一步的作用及用途,和注意事项,一步一步至试验成功,绝对一次成功。
Fast Duplicate File Finder
Oracle RMAN DUPLICATE教程
文件去重Duplicate Cleaner Pro v3.24专业破解版 Duplicate Cleaner 是一款可以帮助你在你的计算机上找到并且清除副本文件的简单易用的软件。你可以立即搜索多个文件夹结构并且设置识别副本文件的标准。你可以选择...
Rman通过duplicate创建standby
Duplicate File Finder单文件
Duplicate File Cleaner 2.5.4.168注册码
Duplicate cleaner pro v3.2.7crack
现在附上解决办法只要把原来的老数据清空导入就可以了。 原理我不明白,贴上来你们自己看吧。反正达到目的就ok了、 “提示#1062 – Duplicate entry ‘1′ for key ‘PRIMARY’了,后来才知道,原来上次超过限制的...
outlook duplicate items remover
Duplicate Cleaner 是由英国著名的 DigitalVolcano 软件公司精心设计与出品的一款专注于重复文件、目录查找与清理的系统工具,该软件能够根据字节、MD5以及其他多种哈希算法等内容比较方式,帮助你快速地查找出重复...
maya路径复制mel脚本 path_duplicate.mel
Duplicate Email Remover
Duplicate File Finder 3.5 完整汉化版 Duplicate File Finder 可以找出硬盘上一个或者多个目录中的重复文件。Duplicate File Finder 不象某些程序仅仅是检查文件名,它检查文件的二进位内容而不理会文件名。可以...
Duplicate Cleaner Pro 3.2.6 破解版
Duplicate Cleaner Pro v3.2.5 绿色中文破解版是一款功能非常强大的重复文件查找工具,这个是无需注册、无需安装的单文件绿色便携版!程序可以帮助你快速的查找重复的图片、音乐等各种文件,可以根据字节、MD5、SHA...