【问题标题】:Converting SQL to HQL [closed]将 SQL 转换为 HQL [关闭]
【发布时间】:2008-11-05 23:06:13
【问题描述】:

我正在尝试将以下 SQL 查询转换为 HQL,但遇到了一些问题。逐行转换不起作用,我想知道是否应该在 HQL 中使用 Inner Join?

        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";

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

【问题讨论】:

    标签: hibernate hql


    【解决方案1】:

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

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

    【讨论】:

    • 你能提供一个链接或其他东西来支持 SQL 查询的“稍微增强”的语法吗?
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-05-26
      • 1970-01-01
      • 1970-01-01
      • 2021-04-04
      • 2011-09-24
      • 1970-01-01
      • 2013-07-02
      • 2014-06-26
      相关资源
      最近更新 更多