我正在使用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
答案 0 :(得分:2)
我做了进一步的研究,发现了这个问题。问题是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";
希望这可以帮助某人
答案 1 :(得分:1)
您的查询需要两个参数
但在您的查询中,使用参数 id 和 interval 。
您的查询应该是:
count = ((Long)sess.createQuery( hql )
.setLong( "pharmacyOid", id)
.setInteger("interval", interval )
.iterate().next()).longValue();