`

如何解决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 提供了多种条件的文件查询功能,这使得用户可以根据自己的需求...

    Duplicate File Cleaner 2.5.4.168注册码

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

    outlook duplicate items remover

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

    ORACLE Duplicate复制数据库

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

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

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

    duplicate cleaner pro 破解版 4.0.5

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

    FirmTools Duplicate Photo Finde

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

    Duplicate Cleaner v2.04

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

    通过duplicate搭建oracle dataguard环境

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

    Oracle 11gR2 使用 RMAN duplicate from active database 复制数据库

    Oracle 11gR2 使用 RMAN duplicate from active database 复制数据库 Oracle 11gR2 中使用 RMAN duplicate from active database 复制数据库是一种高效的数据库复制方法。这种方法可以直接从活动数据库复制,省去...

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

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

    Duplicate File Finder单文件

    Duplicate File Finder单文件

    Duplicate cleaner pro v3.2.7crack

    Duplicate cleaner pro v3.2.7crack

    Extended Duplicate Options

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

    Oracle RMAN DUPLICATE教程

    ### Oracle RMAN DUPLICATE 教程详解 #### 一、RMAN Duplicate 概述 **RMAN (Recovery Manager)** 是 Oracle 数据库管理系统中的一个重要工具,用于管理数据库的备份、恢复以及灾难恢复策略。其中,**Duplicate** ...

    Duplicate_Cleaner

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

    Fast Duplicate File Finder

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

    ODIR(Outlook Duplicate Items Remover)自动删除outlook重复邮件注册破解

    面对众多的重复邮件,如何可以快速地删除重复邮件,Outlook Duplicate Items Remover ,快速,简单

Global site tag (gtag.js) - Google Analytics