2008-11-05 85 views
3

我试图将下面的SQL查询转换为HQL并遇到一些问题。一个一行的直线转换不起作用,我想知道我是否应该在HQL中使用Inner Join?将SQL转换为HQL

 SELECT (UNIX_TIMESTAMP(cosc1.change_date) - UNIX_TIMESTAMP(cosc2.change_date)) 
     FROM customer_order_state_change cosc1 
     LEFT JOIN customer_order_state cos1_new on cosc1.new_state_id = cos1_new.customer_order_state_id 
     LEFT JOIN customer_order_state cos1_old on cosc1.old_state_id = cos1_old.customer_order_state_id 
     LEFT JOIN customer_order_state_change cosc2 on cosc2.customer_order_id = cosc1.customer_order_id 
     LEFT JOIN customer_order_state cos2_new on cosc2.new_state_id = cos2_new.customer_order_state_id 
     LEFT JOIN customer_order_state cos2_old on cosc2.old_state_id = cos2_old.customer_order_state_id 
     WHERE cos1_new.name = "state1" AND cos2_new.name = "state2" and cosc2.change_date < "2008-11-06 09:00" 
AND cosc2.change_date > "2008-11-06 06:00" GROUP BY cosc1.change_date, cosc2.change_date ; 

查询以秒为单位返回客户订单状态更改之间的时间。

将状态名称和日期动态插入到查询中。

编辑: 只是尝试这样做

"SELECT (UNIX_TIMESTAMP(cosc1.changeDate) - UNIX_TIMESTAMP(cosc2.changeDate))" + 
     " FROM" + 
     " " + CustomerOrderStateChange.class.getName() + " as cosc1" + 
     " INNER JOIN " + CustomerOrderStateChange.class.getName() + " as cosc2" + 
     " WHERE cosc1.newState.name = ?" + 
     " AND cosc1.order.id = cosc2.order.id" + 
     " AND cosc2.newState.name = ?" + 
     " AND cosc2.changeDate < ?" + 
     " AND cosc2.changeDate > ?" + 
     " GROUP BY cosc1.changeDate, cosc2.changeDate"; 

并获得例外“外或完全加入必须遵循的路径表达式

回答

6

通常你HQL加入使用对象的属性指定例如,如果类Foo和Bar和Foo.bar是Bar类型,那么from Foo f inner join f.bar as b就是加入。据我所知,没有办法在HQL中执行自连接(我可能在这里是错误的)。

也就是说,Hibernate允许你使用session.createSQLQuery(...)来编写(稍微增强)SQL查询。

+0

你可以提供一个链接或某些对SQL查询的“略增强”语法支持吗? – 2011-03-11 17:08:28

0

最终改为使用原生SQL和PreparedStatement,因为看起来Hibernate的session.createSQLQuery()只适用于Managed Entities。