【问题标题】:Duplicate Association Path Error in HibernateHibernate 中的重复关联路径错误
【发布时间】:2011-05-09 18:30:19
【问题描述】:

当我尝试根据用户的搜索条件以编程方式构建 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 专家的问题,我会收到上述错误。

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

有没有办法做我在这里想要完成的事情?

【问题讨论】:

    标签: java hibernate


    【解决方案1】:

    如果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())
             )
           ....
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-12-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多