【发布时间】:2016-08-12 19:25:47
【问题描述】:
如果找到任何满足 WHERE 条件的记录,我正在尝试运行此 Named 查询以返回 1:
SELECT CASE WHEN EXISTS
(SELECT p
FROM Books p
WHERE bookNum = :bookNum
AND author = :author
AND bookID <> :bookID)
THEN 1
ELSE NULL
END
我使用 EXISTS 使其更快,但在 TOMCAT SERVER START 上出现此错误。
org.hibernate.hql.ast.QuerySyntaxException:子树的意外结束 [SELECT CASE WHEN EXISTS (SELECT p FROM com.userclasses.Books p WHERE bookNum = :bookNum AND author = :author AND bookID :bookID) THEN 1 ELSE NULL END ] 在 org.hibernate.hql.ast.QuerySyntaxException.convert(QuerySyntaxException.java:54) 在 org.hibernate.hql.ast.QuerySyntaxException.convert(QuerySyntaxException.java:47) 在 org.hibernate.hql.ast.ErrorCounter.throwQueryException(ErrorCounter.java:82) 在 org.hibernate.hql.ast.QueryTranslatorImpl.analyze(QueryTranslatorImpl.java:261) 在 org.hibernate.hql.ast.QueryTranslatorImpl.doCompile(QueryTranslatorImpl.java:185) 在 org.hibernate.hql.ast.QueryTranslatorImpl.compile(QueryTranslatorImpl.java:136) 在 org.hibernate.engine.query.HQLQueryPlan.(HQLQueryPlan.java:101) 在 org.hibernate.engine.query.HQLQueryPlan.(HQLQueryPlan.java:80) 在 org.hibernate.engine.query.QueryPlanCache.getHQLQueryPlan(QueryPlanCache.java:124) 在 org.hibernate.impl.SessionFactoryImpl.checkNamedQueries(SessionFactoryImpl.java:549) 在 org.hibernate.impl.SessionFactoryImpl.(SessionFactoryImpl.java:413) 在 org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1872) 在 org.hibernate.ejb.Ejb3Configuration.buildEntityManagerFactory(Ejb3Configuration.java:906)
我运行以下代码来获取休眠版本,正如 this link 中所说的那样,它已修复:
System.out.println(org.hibernate.Version.getVersionString());
System.out.println("Hibernate Version: "+ org.hibernate.annotations.common.Version.VERSION);
它在控制台告诉我这个
3.6.4.Final
Hibernate Version: 3.2.0.Final
【问题讨论】:
-
我认为问题出在您的内部查询上。有没有检查过传递的参数是否在取值。
-
问题是,它是在服务器启动时,而不是在执行期间使用查询:(你能告诉我,如果我使用这个 SELECT COUNT(*) 而不是 EXISTS 做同样的事情,会和它一样快吗?
-
我确实认为,这是我的休眠问题,因为我将查询更改为 SELECT CASE WHEN EXISTS (SELECT p FROM Books p) THEN 1 ELSE NULL END .....但仍然出现错误: ) 我认为我应该将查询更改为不使用 EXISTS :)
-
我认为 EXISTS 会更快。以及查询 SELECT p FROM Books p 的意思。
-
查询将返回表 Book 中的记录。如果表 Book 中有任何与 WHERE 子句条件匹配的记录,我必须编写一个查询以返回 1,否则返回 NULL(或可能为 0)。所以,我写了这个查询