我有一个伪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解析表的名称?
答案 0 :(得分:1)
这不是开箱即用的方法,因为sqlRestriction只解释表达式{alias},但没有表达式来获取别名的表名。但是,您可以从Hibernate / Entity元数据中查找表名,然后将其插入到sqlRestriction中(使用一些不太不受欢迎的字符串连接)。
您希望创建自己的实用程序类,以使用此处描述的方法之一从实体类中获取tablename:Get the table name from the model in Hibernate