簡體   English   中英

如何最好地建模休眠條件查詢

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM