JPQL/HQL和JPA/Hibernate:select构造函数表达式中的布尔表达式不工作(意外的AST节点:and、NPE、HqlSqlWalker.setAlias)?

JPQL/HQL和JPA/Hibernate:select构造函数表达式中的布尔表达式不工作(意外的AST节点:and、NPE、HqlSqlWalker.setAlias)?,hibernate,jpa,hql,jpql,boolean-expression,Hibernate,Jpa,Hql,Jpql,Boolean Expression,我有一个JPQL声明来返回体育比赛时间表: SELECT NEW com.kawoolutions.bbstats.view.ScheduleGameLine( ga.id AS gid , ga.scheduledTipoff

我有一个JPQL声明来返回体育比赛时间表:

SELECT NEW com.kawoolutions.bbstats.view.ScheduleGameLine(
    ga.id                                                                                           AS gid
  , ga.scheduledTipoff                                                                              AS scheduledtipoff
  ...
  , sch.finalScore                                                                                  AS homefinalscore
  , sca.finalScore                                                                                  AS awayfinalscore
  , sch.finalScore IS NOT NULL AND sca.finalScore IS NOT NULL                              AS hasfinalscore
)
我希望最后一个表达式(布尔值)计算为布尔值,以指示是否已完全报告了游戏的最终分数(两个类型为score的实体,这里是sch和sca,用于主客场分数)。但是,Hibernate失败,出现异常:

11.02.2011 18:40:16 org.hibernate.hql.ast.ErrorCounter reportError
SCHWERWIEGEND: <AST>:17:32: unexpected AST node: AND
Exception in thread "main" java.lang.NullPointerException
    at org.hibernate.hql.ast.HqlSqlWalker.setAlias(HqlSqlWalker.java:1000)
    at org.hibernate.hql.antlr.HqlSqlBaseWalker.aliasedSelectExpr(HqlSqlBaseWalker.java:2381)
    at org.hibernate.hql.antlr.HqlSqlBaseWalker.constructor(HqlSqlBaseWalker.java:2505)
    at org.hibernate.hql.antlr.HqlSqlBaseWalker.selectExpr(HqlSqlBaseWalker.java:2256)
    at org.hibernate.hql.antlr.HqlSqlBaseWalker.selectExprList(HqlSqlBaseWalker.java:2121)
    at org.hibernate.hql.antlr.HqlSqlBaseWalker.selectClause(HqlSqlBaseWalker.java:1522)
    at org.hibernate.hql.antlr.HqlSqlBaseWalker.query(HqlSqlBaseWalker.java:593)
    at org.hibernate.hql.antlr.HqlSqlBaseWalker.selectStatement(HqlSqlBaseWalker.java:301)
    at org.hibernate.hql.antlr.HqlSqlBaseWalker.statement(HqlSqlBaseWalker.java:244)
    at org.hibernate.hql.ast.QueryTranslatorImpl.analyze(QueryTranslatorImpl.java:254)
    at org.hibernate.hql.ast.QueryTranslatorImpl.doCompile(QueryTranslatorImpl.java:185)
    at org.hibernate.hql.ast.QueryTranslatorImpl.compile(QueryTranslatorImpl.java:136)
    at org.hibernate.engine.query.HQLQueryPlan.<init>(HQLQueryPlan.java:101)
    at org.hibernate.engine.query.HQLQueryPlan.<init>(HQLQueryPlan.java:80)
    at org.hibernate.engine.query.QueryPlanCache.getHQLQueryPlan(QueryPlanCache.java:124)
    at org.hibernate.impl.AbstractSessionImpl.getHQLQueryPlan(AbstractSessionImpl.java:156)
    at org.hibernate.impl.AbstractSessionImpl.createQuery(AbstractSessionImpl.java:135)
    at org.hibernate.impl.SessionImpl.createQuery(SessionImpl.java:1770)
    at org.hibernate.ejb.AbstractEntityManagerImpl.createQuery(AbstractEntityManagerImpl.java:272)
    at com.kawoolutions.bbstats.Main.executeJpqlStatement(Main.java:167)
    at com.kawoolutions.bbstats.Main.main(Main.java:154)

我真的很想知道为什么这不适用于一个案例。这里怎么了?是我吗?是JPA吗?是冬眠吗?Bug?

它看起来像是一种特定的行为。JPA根本不允许在
SELECT
子句中使用条件表达式,尽管它允许
CASE
表达式

以下是来自以下网站的JPQL语法的相关部分:

选择_表达式::= 单值路径表达式| 标量表达式| 聚合表达式| 识别变量| 对象(标识_变量)| 构造器表达式 构造函数\u表达式::= 新构造函数名称(构造函数项{,构造函数项}*) 构造函数\u项::= 单值路径表达式| 标量表达式| 聚合表达式| 识别变量 标量表达式::= 简单算术表达式| 字符串_主| 枚举主| 主要日期时间| 布尔_主| case_表达式|
实体类型表达式什么是布尔型表达式?引用的布尔成员(它们确实有效)?@Kawu:它是布尔文本(
TRUE
FALSE
),输入参数和布尔属性。
SELECT NEW com.kawoolutions.bbstats.view.ScheduleGameLine(
    ga.id                                                                                           AS gid
  , ga.scheduledTipoff                                                                              AS scheduledtipoff
  ...
  , sch.finalScore                                                                                  AS homefinalscore
  , sca.finalScore                                                                                  AS awayfinalscore
  , CASE WHEN sch.finalScore IS NOT NULL AND sca.finalScore IS NOT NULL THEN TRUE ELSE FALSE END    AS hasfinalscore
  )
select_expression ::= single_valued_path_expression | scalar_expression | aggregate_expression | identification_variable | OBJECT(identification_variable) | constructor_expression constructor_expression ::= NEW constructor_name ( constructor_item {, constructor_item}* ) constructor_item ::= single_valued_path_expression | scalar_expression | aggregate_expression | identification_variable scalar_expression ::= simple_arithmetic_expression | string_primary | enum_primary | datetime_primary | boolean_primary | case_expression | entity_type_expression