Hibernate 将SQL转换为HQL

Hibernate 将SQL转换为HQL,hibernate,hql,Hibernate,Hql,我试图将下面的SQL查询转换为HQL,但遇到了一些问题。直线逐行转换不起作用,我想知道我是否应该在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 co

我试图将下面的SQL查询转换为HQL,但遇到了一些问题。直线逐行转换不起作用,我想知道我是否应该在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\u时间戳(cosc1.change\u日期)-UNIX\u时间戳(cosc2.change\u日期))
来自客户\订单\状态\更改cosc1
左联合客户\订单\状态cos1\新在cosc1上。新\状态\ id=cos1\新。客户\订单\状态\ id
左联合客户\订单\状态cos1\旧在cosc1上。旧的\状态\ id=cos1\旧的。客户\订单\状态\ id
左连接客户\订单\状态\更改cosc2上的cosc2。客户\订单\ id=cosc1。客户\订单\ id
左加入客户\订单\状态cos2\在cosc2上新建。新建\状态\ id=cos2\新。客户\订单\状态\ id
左联合客户\订单\状态cos2\旧在cosc2上。旧的\状态\ id=cos2\旧的。客户\订单\状态\ id
其中cos1_new.name=“state1”和cos2_new.name=“state2”以及cosc2.change_日期<“2008-11-06 09:00”
和cosc2.change_date>“2008-11-06 06 06:00”组由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";
“选择(UNIX_时间戳(cosc1.changeDate)-UNIX_时间戳(cosc2.changeDate))”+
“从”+
“+CustomerOrderStateChange.class.getName()+”作为cosc1”+
“内部联接”+CustomerOrderStateChange.class.getName()+“作为cosc2”+
“其中cosc1.newState.name=?”+
“和cosc1.order.id=cosc2.order.id”+
“和cosc2.newState.name=?”+
“和cosc2.changeDate<?”+
“和cosc2.changeDate>?”+
“按cosc1.changeDate分组,按cosc2.changeDate分组”;

并且收到异常“外部或完全连接后面必须跟路径表达式”

通常使用对象上的属性指定HQL连接,例如,如果类Foo和Bar以及Foo.Bar的类型为Bar,则来自Foo f internal join f.Bar的
作为b
是连接。据我所知,在HQL中没有执行自连接的方法(这里我可能错了)


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

最后改为使用本机SQL和PreparedStatement,因为Hibernate的session.createSQLQuery()似乎只适用于托管实体。

您能否提供一个链接或其他内容,指向SQL查询的“略微增强”语法支持?