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)
只有OpB并OpC有一个字段叫account.
我想查询account属性:
session.createCriteria(Operation.class)
.add(Restrictions.eq("account", account))
.list();
Run Code Online (Sandbox Code Playgroud)
这有效.休眠忽略了一个事实,这两个Operation并OpA没有所谓的领域account,并返回正确的结果OpB和OpC.
但是,现在我还想查询帐户所有者,并按顺序排序.然后,我创建别名_account为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();
Run Code Online (Sandbox Code Playgroud)
这失败了.该帐户有两个单独的表(来自OpB和OpC),所以Hibernate抱怨:
Not unique table/alias: 'account1_'
Run Code Online (Sandbox Code Playgroud)
我的问题:如何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();
Run Code Online (Sandbox Code Playgroud)
只要我不添加 order: ,它就可以工作.addOrder(Order.asc("_account.owner"))。
该订单无法添加到 中Subqueries,因为它不会产生任何效果。并且它无法添加到 中Criteria,因为它不接受别名。
也许有一种方法可以对此进行调整,或者这个解决方案可能太复杂并且有更简单的解决方案?
| 归档时间: |
|
| 查看次数: |
2830 次 |
| 最近记录: |