HQL MEMBER OF到标准转换

时间:2013-08-01 17:08:50

标签: hibernate hql criteria member

将HQL查询移植到条件时遇到了一些问题。

对于抽象,假设我有实体交易,账户,集团和历史,例如交易 - >组 - >帐户< - 历史< - 交易。另请参阅下面的ER图:

enter image description here

我使用下一个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条件的方法。

有人可以帮助我吗?

2 个答案:

答案 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")))));

它解决了我们的问题。我将这个答案标记为解决方案。