当我尝试根据用户的搜索条件以编程方式构建 Criteria 对象时,我遇到了一个问题。简而言之,用户可以输入一个或多个搜索条件,并根据他们输入的内容构建一个 Criteria 对象,基于它执行查询,并显示结果。不幸的是,当我一起使用某些搜索条件时,我收到此错误:
重复关联路径:分配
在我的数据库中,我有一个包含问题的表(称为问题)。一个问题可以分配有多个人,担任不同的角色(例如,它可能分配了审核员和 QA 专家)。分配保存在名为"分配"的单独表中。表格如下所示:
+-------------+ +-----------------+
| Issue | | Assignment |
+-------------+ +-----------------+
| issueID | | assignmentID |
+-------------+ | issueID |
| assigneeID |
| isActive |
| reviewType |
+-----------------+
"issueID"列是"问题"中的主键和"分配"中的外键。
在我的 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 论坛上找到了这个线程,并指出这是 Hibernate 的限制。我希望从那时起会对此采取一些措施,但该线程实际上一直"活着"到 2010 年 6 月,没有提到任何响应/修复。
有没有办法完成我在这里想要完成的事情?
如果 getAuditor()
和 getQASpecialist()
都是非空的,那么你真正想要的不是做一个assignee
值等于 criteria.getAuditor()
OR 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())
)
....
}