将HQL查询移植到条件时遇到了一些问题。
对于抽象,假设我有实体交易,账户,集团和历史,例如交易 - >组 - >帐户< - 历史< - 交易。另请参阅下面的ER图:
我使用下一个HQL查询来获取null-group或group中的帐户的所有事务:
FROM Transaction t
INNER JOIN t.history AS h
INNER JOIN t.group AS g
WHERE t.group IS NULL OR history.account MEMBER OF g.accounts
现在我需要将查询转换为DetachedCriteria
,但不知道hibernate限制如何没有MEMBER OF
条件的方法。
有人可以帮助我吗?
答案 0 :(得分:0)
您需要使用Restrictions.eqProperty,如下所示。希望这会对你有所帮助。
DetachedCriteria hsql = DetachedCriteria.forClass(Transaction.class, "t")
.addAlias("t.history", "h")
.addAlias("t.group", "g")
.add(Restrictions.or(
Restrictions.isNull("t.group"),
Restrictions.eqProperty("h.account", "g.account")
));
答案 1 :(得分:0)
我希望,在这里,工作查询是:
DetachedCriteria criteria = DetachedCriteria.forClass(Transaction.class, "t")
.createAlias("t.history", "h")
.add(Restrictions.or(Restrictions.isNull("t.group"),
Subqueries.propertyNotIn("h.account.id", DetachedCriteria.forClass(Group.class, "g")
.createAlias("g.accounts", "a", CriteriaSpecification.LEFT_JOIN)
.add(Restrictions.eqProperty("t.group.id", "g.id"))
.add(Restrictions.isNotNull("a.id"))
.setProjection(Projections.property("a.id")))));
它解决了我们的问题。我将这个答案标记为解决方案。