`

如何解决hibernate duplicate association

阅读更多

我们使用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;
    }
}

 

 

 

 

 

 

0
0
分享到:
评论

相关推荐

    Duplicate__Net__Names__Wire解决办法

    ### Altium Designer中“Duplicate Net Names Wire”错误的终极解决办法 #### 一、问题概述 在使用Altium Designer进行电路设计过程中,遇到“Duplicate Net Names Wire”这一类错误是较为常见的现象。这类错误通常...

    解决duplicate_file的自定义脚本react_gradle

    本文将详细介绍如何通过一个名为`react_gradle`的自定义脚本来解决`duplicate_file`问题,并讨论与之相关的`jenkins`自动化构建。 首先,我们来看标题中的`react_gradle`,这是针对React Native项目的特定Gradle...

    Duplicate Cleaner Pro 文件去重工具

    "Duplicate Cleaner Pro"就是这样一款专为解决此问题而设计的专业软件,它以其强大的功能和易用性,成为了许多用户的选择。 Duplicate Cleaner Pro 提供了多种条件的文件查询功能,这使得用户可以根据自己的需求...

    outlook duplicate items remover

    Outlook Duplicate Items Remover是一款专为Microsoft Outlook设计的工具,旨在帮助用户解决电子邮件、联系人、日历项、任务和笔记等重复数据的问题。在Outlook中,由于各种原因(如手动复制、同步错误或软件故障)...

    ORACLE Duplicate复制数据库

    ### ORACLE RMAN DUPLICATE 数据库复制详解 #### 概述 在Oracle环境中,通过RMAN(Recovery Manager)工具可以高效地复制整个数据库。本文将详细介绍如何利用RMAN的`DUPLICATE`命令来实现数据库的复制,并针对两种...

    Duplicate File Cleaner 2.5.4.168注册码

    Duplicate File Cleaner是一款功能强大的重复文件清理工具,它能够帮助用户扫描并识别计算机上所有重复的文件,从而节省磁盘空间,提升系统性能。 ### 软件概述 Duplicate File Cleaner的主要功能包括但不限于: ...

    FirmTools Duplicate Photo Finder(查找重复图像) 1.2.0一款整理图像的必备工具.rar

    FirmTools Duplicate Photo Finder是一款整理图像的必备工具,它使用高级搜索算法,会快速在您的硬盘或指定文件夹中找到重复或相似的图像,需要的朋友快来下载吧。 FirmTools Duplicate PhotoFinder 使用了先进的...

    FirmTools Duplicate Photo Finde

    FirmTools Duplicate Photo Finder 相似图像查询软件 你电脑中如果有很多图像,有很多可能是一个logo只差,你用其他md5检测软件是不能快速找出来的。这个软件可以搜索相似的图像,你查看后选择删除,非常的方便。 ...

    Alike Duplicate Image Finder 2.2 绿色版-----查找重复图片

    为了有效地解决这个问题,"Alike Duplicate Image Finder 2.2 绿色版"应运而生,它是一款专为用户设计的高效、便捷的重复图片查找工具。 首先,我们来了解一下"Alike"的核心功能。该软件的主要目标是帮助用户快速...

    Duplicate Cleaner v2.04

    【Duplicate Cleaner v2.04】是一款高效实用的免费软件,专为用户解决电脑中重复文件堆积的问题。这款工具能够帮助用户快速扫描、识别并删除重复的文件,从而释放宝贵的磁盘空间,优化电脑性能。 在当今数字时代,...

    duplicate cleaner pro 破解版 4.0.5

    duplicate cleaner pro 破解版 4.0.5 。安装后,将第二步的x86及x64目录下的文件拷贝到安装目录下的x86与x64下。然后启动,输入长一点的序列号(随便输入字符),即可破解。

    通过duplicate搭建oracle dataguard环境

    Oracle DataGuard是一种高可用性和灾难恢复解决方案,它能够保护数据免受逻辑和物理故障的影响。DataGuard通过创建并维护一个或多个备用数据库来实现这一点,这些备用数据库可以是物理副本、快照副本或是只读副本。...

    Duplicate File Finder单文件

    Duplicate File Finder单文件

    Duplicate cleaner pro v3.2.7crack

    Duplicate cleaner pro v3.2.7crack

    Extended Duplicate Options

    Extended Duplicate则为这些问题提供了解决方案。 首先,该插件允许用户在复制对象时保留其原有的父层级关系,这意味着你可以快速创建一系列关联的对象,如骨骼系统、模拟群组等,而无需手动重新设置每个副本的父子...

    Duplicate_Cleaner

    这时,一款高效的重复文件清理工具就显得尤为重要,而Duplicate Cleaner Pro正是这样一款专业级别的解决方案。本文将深入探讨Duplicate Cleaner Pro的功能、操作流程以及其在不同系统环境下的应用。 首先,让我们...

    Fast Duplicate File Finder

    总的来说,"Fast Duplicate File Finder"是解决电脑中重复文件问题的有效解决方案,它的高效扫描、智能比较和安全删除等功能,使得文件管理变得更加简单和便捷。合理利用这款工具,可以有效地优化系统资源,提升电脑...

    Duplicate Cleaner Pro 5.19.0.0_中文直装版文件查重神器 .exe

    Duplicate Cleaner Pro 5.19.0.0_中文直装版文件查重神器

    Duplicate.Cleaner.Pro.3.2.5 硬盘文件查重工具

    "Duplicate Cleaner Pro 3.2.5"就是这样一把利剑,专为解决硬盘中的文件重复问题而设计。 Duplicate Cleaner Pro是一款强大的重复文件查找和清理软件,其3.2.5版本更是经过多次优化,性能稳定,功能完善。它能够...

Global site tag (gtag.js) - Google Analytics