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

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

 class Operation {}
 class OpA extends Operation { }
 class OpB extends Operation { Account account; }
 class OpC extends Operation { Account account; }

只有OpB和OpC有一个名为account的字段.

我想查询帐户属性:

session.createCriteria(Operation.class)
       .add(Restrictions.eq("account", account))
       .list();

这有效. Hibernate忽略了一个事实,即Operation和OpA都没有名为account的字段,并返回
OpB和OpC的正确结果.

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

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

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

Not unique table/alias: 'account1_'

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

最佳答案
这是我的解决方案.它只能部分工作:

 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();

只要我不添加命令,它就可以工作:.addOrder(Order.asc(“_ account.owner”)).

订单无法添加到子查询中,因为它不起作用.
它无法添加到Criteria中,因为它不接受别名.

也许有一种方法可以调整它,或者这个解决方案太复杂了,而且更简单?

转载注明原文:java – 仅存在于子类中的属性的别名(Hibernate Criteria) - 代码日志