【问题标题】:Hibernate error when using SELECT CASE WHEN使用 SELECT CASE WHEN 时出现休眠错误
【发布时间】: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)。所以,我写了这个查询

标签: java hibernate jpa


【解决方案1】:

这解决了它

SELECT CASE WHEN EXISTS
(SELECT p
    FROM Books p
    WHERE bookNum = :bookNum
    AND author = :author
    AND bookID <> :bookID)
THEN 1
ELSE NULL
END FROM Books p

但是添加 FROM Books p 不会提高性能,因为它现在会返回列表,而不是一条记录:(

【讨论】:

    猜你喜欢
    • 2022-01-18
    • 2014-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-06
    • 1970-01-01
    • 2013-08-16
    相关资源
    最近更新 更多