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

我在7年前开始的Hibernate论坛上发现了this thread,并指出这是对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/

10-12 20:52