代码之家  ›  专栏  ›  技术社区  ›  jprism

mysql date_add throws hibernate错误

  •  0
  • jprism  · 技术社区  · 7 年前

    我正在使用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抛出了一个令牌错误,如下所示

    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

    2 回复  |  直到 7 年前
        1
  •  2
  •   jprism    7 年前

    我做了进一步的研究,发现了这个问题。问题是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
  •  1
  •   Peter1982    7 年前

    您的查询需要两个参数

    • 类药物
    • 间隔

    但在查询参数中 身份证件 间隔 使用。

    您的查询应如下所示:

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