【问题标题】:Convert SQL query to HQL将 SQL 查询转换为 HQL
【发布时间】:2014-06-26 17:51:17
【问题描述】:

我有个sql语句如下,

select *
from (select distinct field1
from X
where field2 = 'value2'
and field3 > 'value3'
and field4 in(value4)
and field5 in(value5)
and field6 is null 
order by field1)
where ROWNUM <= 20 ;

我尝试将其转换为 HQL,如下所示,

 DetachedCriteria detachedQuery = DetachedCriteria.forClass(X.class)
     .setProjection(Projections.property("field1"))
     .add(Restrictions.eq("field2",value2))  
     .add(Restrictions.gt("field1", value1))
     .add(Restrictions.in("field3",value3))
     .add(Restrictions.in("field4", value4))
     .add(Restrictions.isNull("field5"))
     .addOrder(Order.asc("field1"));

     Criteria criteria= session.createCriteria(X.class);
     criteria.add(Property.forName("field1")
         .in(detachedQuery))
         .setMaxResults(20);

我说的对吗?

【问题讨论】:

  • 您可以使用 hibernate.cfg.xml 中的 show-sql 属性自己查看
  • 你能详细说明一下吗?我是休眠新手。

标签: sql hibernate select pagination hql


【解决方案1】:

你没有请求一个独特的投影,你不能只去.in(subquery)你必须使用Subqueries类,除了它看起来没问题。

 DetachedCriteria detachedQuery = DetachedCriteria.forClass(X.class)
 .setProjection(Projections.distinct(Projections.property("field1")))
 .add(Restrictions.eq("field2",value2))  
 .add(Restrictions.gt("field1", value1))
 .add(Restrictions.in("field3",value3))
 .add(Restrictions.in("field4", value4))
 .add(Restrictions.isNull("field5"))
 .addOrder(Order.asc("field1");

 Criteria criteria= session.createCriteria(X.class);
 criteria.add(Property.forName("field1")
     .in(detachedQuery))
     .setMaxResults(20);

【讨论】:

  • criteria.add(Property.forName("field1") .add(Subqueries.in(detachedQuery)) .setMaxResults(20); 会做什么?我的意思是它会过滤掉field1一个人?
  • .add(Subqueries.in(detachedQuery) 将为您进行子选择。它的Projections.distinct(Projections.property("field1"))) 将执行select distinct
  • Subqueries.in() 接受 2 个参数,对吗? (object,detachedCriteria) ?
  • 那么你的查询是错误的,criteria.add(Property.forName("field1") .add(Subqueries.in(detachedQuery)) .setMaxResults(20); 请用正确的语法编辑它。
  • 抱歉,这里的目的代码被交叉了。我假设您正在使用您的子查询来限制您的集合,但是您将它用于所有内容,并且只想设置最大结果。更新
猜你喜欢
  • 2013-07-02
  • 1970-01-01
  • 1970-01-01
  • 2021-11-02
  • 2017-07-12
  • 2018-06-20
  • 2012-09-06
  • 2016-09-22
  • 2020-03-28
相关资源
最近更新 更多