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

これはHibernateで動作しています。ASこれは、標準の JPA 2.2 または JPA 2.1 の後に句を置くことで、 etc. 句SELECT ...の識別子を再利用できると思いました。ORDER BY

質問:

どうしたの?それはEclipseLinkのバグ/欠落している機能ですか? Hibernateには余分な肉があるので、そのように機能するはずはありませんか?

コンストラクター式でこれをどのように回避できますか (ORDER BY句で式を繰り返す必要はありません)。

4

1 に答える 1

1

select_itemではないため、実際には無効な JPQLconstructor_itemです。以下は、JPA 2.2 仕様から取られた SELECT 句の構文です。

select_clause ::= SELECT [DISTINCT] select_item {, select_item}* 
select_item ::= select_expression [ [AS] result_variable]
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
aggregate_expression ::= 
  { AVG | MAX | MIN | SUM} ([DISTINCT] state_valued_path_expression) |
  COUNT ([DISTINCT] identification_variable | state_valued_path_expression
    |single_valued_object_path_expression) |
  function_invocation

この場合の繰り返しを回避する回避策はありません。

于 2020-01-11T08:53:03.987 に答える