仅存在于子类中的属性的别名(Hibernate Criteria)

Mar*_*rcG 5 java hibernate subquery detachedcriteria hibernate-criteria

考虑该类Operation及其3个子类:

 class Operation {}
 class OpA extends Operation { }
 class OpB extends Operation { Account account; }
 class OpC extends Operation { Account account; }
Run Code Online (Sandbox Code Playgroud)

只有OpBOpC有一个字段叫account.

我想查询account属性:

session.createCriteria(Operation.class)
       .add(Restrictions.eq("account", account))
       .list();
Run Code Online (Sandbox Code Playgroud)

这有效.休眠忽略了一个事实,这两个OperationOpA没有所谓的领域account,并返回正确的结果OpBOpC.

但是,现在我还想查询帐户所有者,并按顺序排序.然后,我创建别名_accountaccount:

session.createCriteria(Operation.class)
       .add(Restrictions.eq("account", account))
       .createAlias("account", "_account")
       .add(Restrictions.eq("_account.owner", "John"))
       .addOrder(Order.asc("_account.owner"))
       .list();
Run Code Online (Sandbox Code Playgroud)

这失败了.该帐户有两个单独的表(来自OpBOpC),所以Hibernate抱怨:

Not unique table/alias: 'account1_'
Run Code Online (Sandbox Code Playgroud)

我的问题:如何Criteria以最简单的方式使用(无SQL,HQL)查询帐户和帐户所有者?

Mar*_*rcG 4

这是我的解决方案。它仅部分有效:

 Criterion subQ1 = Subqueries.propertyIn("id",
                       DetachedCriteria.forClass(OpB.class)
                            .add(Restrictions.eq("account", account))
                            .createAlias("account", "_account")
                            .add(Restrictions.eq("_account.owner", "John"))
                            .setProjection(Projections.groupProperty("id")));

 Criterion subQ2 = Subqueries.propertyIn("id",
                       DetachedCriteria.forClass(OpC.class)
                            .add(Restrictions.eq("account", account))
                            .createAlias("account", "_account")
                            .add(Restrictions.eq("_account.owner", "John"))
                            .setProjection(Projections.groupProperty("id")));

 session.createCriteria(Operacao.class)
        .add(Restrictions.disjunction()
            .add(subQ1)
            .add(subQ2))
        .list();
Run Code Online (Sandbox Code Playgroud)

只要我不添加 order: ,它就可以工作.addOrder(Order.asc("_account.owner"))

该订单无法添加到 中Subqueries,因为它不会产生任何效果。并且它无法添加到 中Criteria,因为它不接受别名。

也许有一种方法可以对此进行调整,或者这个解决方案可能太复杂并且有更简单的解决方案?