0

我在将 HQL 查询移植到标准时遇到了一些麻烦。

对于抽象,假设我有实体 Transaction、Account、Group 和 History,例如 Transaction -> Group -> Account <- History <- Transaction。另请参阅下面的 ER 图:

在此处输入图像描述

我使用下一个 HQL 查询来获取具有空组或组中帐户的所有事务:

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,但不知道由于休眠限制没有MEMBER OF标准方法。

有人可以帮我吗?

4

2 回答 2

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")
   ));
于 2013-08-02T08:45:43.063 回答
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")))));

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

于 2013-08-05T17:07:47.653 回答