【问题标题】:How to see HQL final query如何查看 HQL 最终查询
【发布时间】:2012-05-28 03:51:44
【问题描述】:

我正在尝试运行以下查询并获得空指针异常。我已经验证 WHERE lockedTimestamp <= (GETDATE() - CAST('00:06' AS datetime) 是有效的 msSQL,因为我可以手动运行它并且它会正常工作。看起来 HQL(Hibernate Query Language)可能不喜欢它。关于如何进行调试有什么想法吗?

Query query = this.em.createQuery("SELECT c FROM Content c WHERE lockedTimestamp <= (GETDATE() - CAST('00:06' AS datetime))");

【问题讨论】:

    标签: sql-server hibernate jpql


    【解决方案1】:

    为什么不使用更明显和直观的计算,例如

    SELECT c FROM Content c WHERE lockedTimestamp <= DATEADD(MINUTE, -6, GETDATE());
    

    ?我认为这在 JPQL 中也无效,但更多的是一般查询本身,以防其他用户偶然发现这个问题......

    顺便说一句,为什么不把这个查询放在一个存储过程中呢?当然,hibernate 可以调用存储过程,那么它就不需要尝试解释或反向工程您的查询。

    【讨论】:

    • +1 以便于查询更容易......我如何将它与 createQuery() 一起使用 ^_^
    • @Webnet 不知道,抱歉 - 我知道 SQL,但我不使用休眠。
    【解决方案2】:

    EntityManager.createQuery 需要 JPQL 中的查询字符串(不是 HQL,也不是 SQL)。 JPQL 没有定义CAST 函数。

    我会在 Java 中计算时间戳限制,并将其作为参数传递给查询:

    Date limit = ...;
    this.em.createQuery("SELECT c FROM Content c WHERE lockedTimestamp <= ?")
           .setParameter(0, limit);
    

    【讨论】:

      【解决方案3】:

      debug sql,您可以通过在hibernate 配置属性中添加配置hibernate.show_sql=true 来显示启动Hibernate 的查询。

      查询将显示在控制台中,这是 hibernate 对数据库进行的确切查询。

      【讨论】:

        猜你喜欢
        • 2017-07-27
        • 1970-01-01
        • 2010-11-05
        • 2016-01-17
        • 2013-12-24
        • 2020-09-22
        • 1970-01-01
        • 2011-02-08
        • 2013-05-29
        相关资源
        最近更新 更多