[英]How best to model Hibernate Criteria Query
我有一個偽SQL查詢,如下所示:
from TableA as a
join fetch TableB as b
WHERE
(a.id, a.revision) IN ( SELECT id, MAX (revision) FROM TableA GROUP BY id)
and
(b.id, b.revision) IN ( SELECT id, MAX (revision) FROM TableB GROUP BY id);
並且我想使用休眠標准api進行相同的操作。
我有一個解決方案,但它有一個缺點:
final Criteria criteria = getSession().createCriteria(TableA.class, "a");
criteria.setFetchMode("btables", FetchMode.JOIN); //$NON-NLS-1$
criteria.add(Restrictions.sqlRestriction("({alias}.id, {alias}.revision) IN ( SELECT id, MAX (revision) FROM TableA GROUP BY id)"));
Criteria bSubCriteria = criteria.createCriteria("a.btables", "b");
bSubCriteria.add(Restrictions.sqlRestriction("({alias}.id, {alias}.revision) IN ( SELECT id, MAX (revision) FROM TableB GROUP BY id)"));
解決方案的問題是我必須在sql限制中顯式命名表。
有沒有人有更好的方法可以對此建模,而無需注入任何sql或通過讓Hibernate解析表名呢?
沒有開箱即用的方法來執行此操作,因為sqlRestriction僅解釋表達式{alias},但是沒有表達式可獲取別名的表名。 但是,您可以從Hibernate / Entity元數據中查找表名,然后將其插入到sqlRestriction中(使用一些不太受歡迎的字符串連接)。
您想要使用此處描述的方法之一創建自己的實用程序類,以從實體類中獲取表名:從Hibernate中的模型獲取表名。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.