【问题标题】:How best to model Hibernate Criteria Query如何最好地建模 Hibernate Criteria Query
【发布时间】:2014-02-06 16:00:13
【问题描述】:

我有一个如下所示的伪 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 解析表的名称?

【问题讨论】:

    标签: java sql hibernate criteria-api


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 2013-05-27
      • 2011-05-11
      • 2014-10-03
      • 2017-07-17
      • 1970-01-01
      • 1970-01-01
      • 2015-11-18
      • 2013-11-09
      • 2015-12-18
      相关资源
      最近更新 更多