java - Hibernate 中的重复关联路径错误

标签 java hibernate

当我尝试根据用户的搜索条件以编程方式构建 Criteria 对象时,遇到了问题。简而言之,用户可以输入一个或多个搜索条件,然后根据他们输入的内容构建一个 Criteria 对象,基于它执行查询并显示结果。不幸的是,当我同时使用某些搜索条件时,我收到此错误:

重复的关联路径:分配

在我的数据库中,我有一个包含问题的表(称为问题)。一个问题可以分配给多个具有不同角色的人员(例如,可能分配有一名审核员和一名 QA 专家)。分配维护在一个名为“分配”的单独表中。这些表格看起来像这样:

+-------------+    +-----------------+
| Issue       |    | Assignment      |
+-------------+    +-----------------+
| issueID     |    | assignmentID    |
+-------------+    | issueID         |
                   | assigneeID      |
                   | isActive        |
                   | reviewType      |
                   +-----------------+

列issueID是Issue中的主键和Assignment中的外键。

在我的 Java 代码中,我有这样的内容:

public List<MortalityCase> searchCases(SearchCriteria criteria)
{
    Criteria search = HibernateUtil.getSession().createCriteria(Issue.class);

    if ( criteria.getIssueNumber() != null )
    {
        search.add(Restrictions.eq("issueNumber", criteria.getIssueNumber()));
    }

    ...

    if ( criteria.getAuditor() != null )
    {
        search.createCriteria("assignments")
            .add(Restrictions.eq("assignee", criteria.getAuditor()))
            .add(Restrictions.eq("isActive", "Y"))
            .add(Restrictions.eq("reviewType", getReviewType(TypeOfReview.AUDITOR)));
    }
    if ( criteria.getQASpecialist() != null )
    {
        search.createCriteria("assignments")
            .add(Restrictions.eq("assignee", criteria.getQASpecialist()))
            .add(Restrictions.eq("isActive", "Y"))
            .add(Restrictions.eq("reviewType", getReviewType(TypeOfReview.QA_SPECIALIST)));
    }

    ...

    return search.list();
}

如果用户搜索分配给审核员或 QA 专家的问题,此方法效果很好。但是,如果用户尝试搜索分配给给定审核员和给定 QA 专家的问题,我会收到上述错误。

我找到了this thread在 7 年前开始的 Hibernate 论坛上,指出这是 Hibernate 的一个限制。我希望从那时起就可以对此采取一些措施,但该线程实际上一直“活跃”,直到 2010 年 6 月,没有提到任何响应/修复。

有办法实现我在这里想要完成的任务吗?

最佳答案

如果两者getAuditor()getQASpecialist()是非空的,那么您真正想要的不是执行查询,其中 assignee值等于criteria.getAuditor()criteria.getQASpecialist()

例如:

if ( criteria.getAuditor() != null && criteria.getQASpecialist() != null) {
     search.createCriteria("assignments")
        .add(Restrictions.or(
             Restrictions.eq("assignee", criteria.getAuditor()),
             Restrictions.eq("assignee", criteria.getQASpecialist())
         )
       ....
}

关于java - Hibernate 中的重复关联路径错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5940922/

相关文章:

java - "Specializing"子类型的方法抛出检查异常?

java - Hibernate 拦截器 - 加载事件后

java - 应用程序的 map 在请求权限后首次运行时保持空白,但在关闭并重新打开后可以正常工作

java - 调试 XQuery - XPTY0019 错误

java - Hibernate 左连接返回对象

java - 如果找不到实体则为空对象

java - Envers 与 Hibernate 拦截器,onDelete

java - Hibernate 5.0.6配置异常: The application must supply JDBC connections

java - 空主题行给出空指针异常

java - 是否可以使用 JSR 303 字段验证来验证 List<String> 值