【问题标题】:MySQL DATE_ADD throws Hibernate errorMySQL DATE_ADD 引发休眠错误
【发布时间】:2018-05-24 18:19:44
【问题描述】:

我正在使用 HQL 和 DATE_ADD(mysql 函数),如下所示

String hql = 
        "select count(*) " +
        "from ProgramGroupEvent as eventLog " +
        "where eventLog.id= :id" +
        "and DATE_ADD( eventLog.eventDate, INTERVAL :interval MINUTE) > now()"; 


    long count = 0;

    try {
        count = ((Long)sess.createQuery( hql )
            .setLong( "id", id)
            .setInteger("interval", interval )
            .iterate().next()).longValue();

    } catch (HibernateException e) {
        e.printStackTrace();
    }

但是hibernate会抛出如下的token错误

antlr.NoViableAltException: unexpected token: :
at org.hibernate.hql.internal.antlr.HqlBaseParser.identPrimary(HqlBaseParser.java:4016) ~[hibernate-core-4.1.7.Final.jar:4.1.7.Final]
at org.hibernate.hql.internal.antlr.HqlBaseParser.primaryExpression(HqlBaseParser.java:859) ~[hibernate-core-4.1.7.Final.jar:4.1.7.Final]
at org.hibernate.hql.internal.antlr.HqlBaseParser.atom(HqlBaseParser.java:3390) ~[hibernate-core-4.1.7.Final.jar:4.1.7.Final]

PS:我使用的是 Hibernate 4.1.7

【问题讨论】:

    标签: mysql hibernate


    【解决方案1】:

    我做了进一步的研究,发现了这个问题。问题是 Hibernate 无法解析语法。正如预期的那样,这不是格式良好的 HQL 语法。 https://forum.hibernate.org/viewtopic.php?f=1&t=982317&view=previous

    我通过替换修复了

    DATE_ADD( eventLog.eventDate, INTERVAL :interval MINUTE) > now()"; 
    

    time_to_sec(timediff( now() , eventLog.eventDate )) < :seconds"; 
    

    希望这对某人有所帮助

    【讨论】:

      【解决方案2】:

      您的查询需要两个参数

      • pharmacyOid
      • 间隔

      但在您的查询参数中使用 idinterval

      您的查询应如下所示:

      count = ((Long)sess.createQuery( hql )
              .setLong( "pharmacyOid", id)
              .setInteger("interval", interval )
              .iterate().next()).longValue();
      
      猜你喜欢
      • 1970-01-01
      • 2016-08-15
      • 2016-10-24
      • 1970-01-01
      • 2013-04-13
      • 2023-03-22
      • 2012-05-14
      • 2014-07-17
      相关资源
      最近更新 更多