我正在使用Hibernate OGM和MongoDB。我的JPA QL如下:
String checkquery = "SELECT p FROM pppoe_test p where p.sourceIP=:source_ip and p.login>:logentrytime and (p.logout>:logentrytime OR p.logout IS NULL)";
我收到如下错误:
在输入'NULL'
时没有可行的选择HQL000002:查询SELECT p FROM PPPoESession p其中p.sourceIP =:source_ip和p.login>:logentrytime和(p.logout>:logentrytime或p.logout IS NULL)无效
Exception in thread "main" org.hibernate.hql.ParsingException: HQL000002: The query SELECT p FROM PPPoESession p where p.sourceIP=:source_ip and p.login>:logentrytime and p.logout>:logentrytime OR p.logout IS NULL is not valid; Parser error messages: [[statement, statementElement, selectStatement, queryExpression, querySpec, whereClause, logicalExpression, expression, logicalOrExpression, logicalAndExpression, negatedExpression, equalityExpression]: line 1:144 state 0 (decision=51) no viable alt; token=[@51,144:147='NULL',<75>,1:144]].
at org.hibernate.hql.QueryParser.parseQuery(QueryParser.java:70)
at org.hibernate.ogm.datastore.mongodb.query.parsing.impl.MongoDBBasedQueryParserService.parseQuery(MongoDBBasedQueryParserService.java:40)
at org.hibernate.ogm.query.impl.OgmQueryTranslator.getQuery(OgmQueryTranslator.java:169)
at org.hibernate.ogm.query.impl.OgmQueryTranslator.getLoader(OgmQueryTranslator.java:134)
at org.hibernate.ogm.query.impl.OgmQueryTranslator.list(OgmQueryTranslator.java:128)
at org.hibernate.engine.query.spi.HQLQueryPlan.performList(HQLQueryPlan.java:216)
at org.hibernate.internal.SessionImpl.list(SessionImpl.java:1326)
at org.hibernate.internal.QueryImpl.list(QueryImpl.java:87)
at org.hibernate.jpa.internal.QueryImpl.list(QueryImpl.java:606)
at org.hibernate.jpa.internal.QueryImpl.getResultList(QueryImpl.java:483)
我有一个原生的mongo查询可以工作,但无法让它通过这个JPA路由。任何指针都会有所帮助。
这是我之前通过OGM插入的mongodb文档。
{
"_id" : "cc88a708-c222-4e52-b151-c0f40556b27e",
"connectionTimeInSeconds" : NumberLong(100),
"location" : "MyCastle",
"datatransferIn" : NumberLong(7777777),
"sourceIP" : "172.168.10.123",
"packetsOut" : NumberLong(33333),
"login" : ISODate("2016-07-09T20:45:36.492Z"),
"logout" : null,
"user" : "dvinod@xyz.com",
"packetsIn" : NumberLong(22222),
"datatransferOut" : NumberLong(5555555)
}
我确实在实体中正确设置了属性
@Entity (name="pppoe_test")
public class PPPoESession { ...
@Temporal(TemporalType.TIMESTAMP)
private Date logout;
@Basic(optional = false)
private String user;
@Basic(optional = false)
private String sourceIP;
感谢。
UPDATE1 :问题不是特定于日期类型,而是针对字符串。想知道是否为MongoDB提供程序提供了对IS NULL的支持。已发布在Hibernate OGM论坛上。当我收到他们的回复时,应该更新。
UPDATE2 :显然问题在于解析器的区分大小写为'null','false'和'true'。问题出现在当前最新版本的OGM v5.0.1中。错误跟踪器中出现了一个问题,正在进行处理(https://hibernate.atlassian.net/browse/OGM-1118)