EclipseLink在构造函数表达式中使用SELECT…AS时引发JPQLException]

问题描述 投票:1回答:1
我有一个使用

EclipseLink 2.7.5

具有构造函数表达式的JPQL查询。失败:

Caused by: Exception [EclipseLink-0] (Eclipse Persistence Services - 2.7.5.v20191016-ea124dd158): org.eclipse.persistence.exceptions.JPQLException Exception Description: Syntax error parsing [ SELECT NEW net.bbstats.dto.PlayerStatDto( gl.playerId, gl.seasonStartYear, gl.lastName, gl.firstName, gl.incognito, COUNT(DISTINCT gl.gameId) AS games, SUM(CASE WHEN gl.hasPlayed = FALSE THEN 1 ELSE 0 END) AS gamesplayed, SUM(CASE WHEN gl.starter = TRUE THEN 1 ELSE 0 END) AS gamesstarted, SUM(gl.threePointersMade), SUM(gl.freeThrowsMade), SUM(gl.freeThrowsAttempted), SUM(gl.personalFouls), SUM(CASE WHEN gl.personalFouls >= 5 THEN 1 ELSE 0 END), SUM(gl.points) AS points, MAX(gl.points), MIN(gl.points) ) FROM GameLog gl WHERE gl.roundId = :roundId AND gl.groupCode = :groupCode AND gl.rosterId IN :rosterIds GROUP BY gl.playerId, gl.seasonStartYear, gl.lastName, gl.firstName, gl.incognito ORDER BY gamesstarted DESC, games DESC, points DESC, gl.lastName, gl.firstName ]. [140, 141] The constructor expression has two constructor items ('COUNT(DISTINCT gl.gameId)' and 'AS games') that are not separated by a comma. [204, 205] The constructor expression has two constructor items ('SUM(CASE WHEN gl.hasPlayed = FALSE THEN 1 ELSE 0 END)' and 'AS gamesplayed') that are not separated by a comma. [271, 272] The constructor expression has two constructor items ('SUM(CASE WHEN gl.starter = TRUE THEN 1 ELSE 0 END)' and 'AS gamesstarted') that are not separated by a comma. [462, 463] The constructor expression has two constructor items ('SUM(gl.points)' and 'AS points') that are not separated by a comma. [141, 149] The expression is invalid, which means it does not follow the JPQL grammar. [205, 219] The expression is invalid, which means it does not follow the JPQL grammar. [272, 287] The expression is invalid, which means it does not follow the JPQL grammar. [463, 472] The expression is invalid, which means it does not follow the JPQL grammar. at org.eclipse.persistence.internal.jpa.jpql.HermesParser.buildException(HermesParser.java:157) at org.eclipse.persistence.internal.jpa.jpql.HermesParser.validate(HermesParser.java:336) at org.eclipse.persistence.internal.jpa.jpql.HermesParser.populateQueryImp(HermesParser.java:280) at org.eclipse.persistence.internal.jpa.jpql.HermesParser.buildQuery(HermesParser.java:165) at org.eclipse.persistence.internal.jpa.EJBQueryImpl.buildEJBQLDatabaseQuery(EJBQueryImpl.java:142) at org.eclipse.persistence.internal.jpa.JPAQuery.processJPQLQuery(JPAQuery.java:225) at org.eclipse.persistence.internal.jpa.JPAQuery.prepare(JPAQuery.java:186) at org.eclipse.persistence.queries.DatabaseQuery.prepareInternal(DatabaseQuery.java:631) at org.eclipse.persistence.internal.sessions.AbstractSession.processJPAQuery(AbstractSession.java:4502) at org.eclipse.persistence.internal.sessions.AbstractSession.processJPAQueries(AbstractSession.java:4462) at org.eclipse.persistence.internal.sessions.DatabaseSessionImpl.initializeDescriptors(DatabaseSessionImpl.java:645) at org.eclipse.persistence.internal.sessions.DatabaseSessionImpl.postConnectDatasource(DatabaseSessionImpl.java:868) at org.eclipse.persistence.internal.sessions.DatabaseSessionImpl.loginAndDetectDatasource(DatabaseSessionImpl.java:811) at org.eclipse.persistence.internal.jpa.EntityManagerFactoryProvider.login(EntityManagerFactoryProvider.java:256) at org.eclipse.persistence.internal.jpa.EntityManagerSetupImpl.deploy(EntityManagerSetupImpl.java:772) ... 201 more

这正在休眠中。我认为这是标准的JPA 2.2甚至是JPA 2.1,可以在AS之后放置一个SELECT ...子句,以便可以为ORDER BY等子句重用标识符。

Q

的:
怎么了?它是EclipseLink错误/缺失功能吗?因为Hibernate在这里有一些多余的肉,所以不应该那样做吗?

如何在构造函数表达式中解决此问题(而不必重复ORDER BY子句中的表达式)?

我有一个使用EclipseLink 2.7.5的带有构造函数表达式的JPQL查询。它失败并显示:原因:异常[EclipseLink-0](Eclipse Persistence Services-2.7.5.v20191016-ea124dd158):org ....

jpa eclipselink jpql jpa-2.1 jpa-2.2
1个回答
1
投票
这确实是无效的JPQL,因为select_item不是constructor_item。下面是取自JPA 2.2规范的SELECT子句的语法:
© www.soinside.com 2019 - 2024. All rights reserved.