如何最好地建模Hibernate Criteria Query

时间:2014-02-06 16:00:14

标签: java sql hibernate criteria-api

我有一个伪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);

我想使用hibernate标准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解析表的名称?

1 个答案:

答案 0 :(得分:1)

这不是开箱即用的方法,因为sqlRestriction只解释表达式{alias},但没有表达式来获取别名的表名。但是,您可以从Hibernate / Entity元数据中查找表名,然后将其插入到sqlRestriction中(使用一些不太不受欢迎的字符串连接)。

您希望创建自己的实用程序类,以使用此处描述的方法之一从实体类中获取tablename:Get the table name from the model in Hibernate