EclipseLink で、NetBeans の JPQL 問合せの実行でクエリを実行したところ、以下のエラーが発生しました。
エラー内容と、対処法を記載します。
エラー内容
Local Exception Stack:
Exception [EclipseLink-6078] (Eclipse Persistence Services - 2.5.2.v20140319-9ad6abd): org.eclipse.persistence.exceptions.QueryException
Exception Description: The class of the argument for the object comparison is incorrect.
Expression: [
Base xyz.monotalk.xxx]
Mapping: [org.eclipse.persistence.mappings.ManyToOneMapping[festivalArtistTagId]]
Argument: [5]
Query: ReadAllQuery(referenceClass=SearchResult jpql="SELECT
sResult
FROM
SearchResult sResult
INNER JOIN SearchQuery sQuery
ON sResult.searchQueryId = sQuery
INNER JOIN FATagSQueryRelation fATSQRelation
ON sQuery = fATSQRelation.searchQueryId
WHERE
fATSQRelation.festivalArtistTagId = 5")
at org.eclipse.persistence.exceptions.QueryException.incorrectClassForObjectComparison(QueryException.java:601)
at org.eclipse.persistence.mappings.OneToOneMapping.buildObjectJoinExpression(OneToOneMapping.java:298)
at org.eclipse.persistence.internal.expressions.RelationExpression.normalize(RelationExpression.java:830)
at org.eclipse.persistence.internal.expressions.SQLSelectStatement.normalize(SQLSelectStatement.java:1449)
at org.eclipse.persistence.internal.queries.ExpressionQueryMechanism.buildNormalSelectStatement(ExpressionQueryMechanism.java:549)
at org.eclipse.persistence.internal.queries.ExpressionQueryMechanism.prepareSelectAllRows(ExpressionQueryMechanism.java:1720)
at org.eclipse.persistence.queries.ReadAllQuery.prepareSelectAllRows(ReadAllQuery.java:813)
at org.eclipse.persistence.queries.ReadAllQuery.prepare(ReadAllQuery.java:744)
at org.eclipse.persistence.queries.DatabaseQuery.checkPrepare(DatabaseQuery.java:661)
at org.eclipse.persistence.queries.ObjectLevelReadQuery.checkPrepare(ObjectLevelReadQuery.java:901)
at org.eclipse.persistence.queries.DatabaseQuery.checkPrepare(DatabaseQuery.java:613)
at org.eclipse.persistence.internal.jpa.EJBQueryImpl.buildEJBQLDatabaseQuery(EJBQueryImpl.java:194)
at org.eclipse.persistence.internal.jpa.EJBQueryImpl.buildEJBQLDatabaseQuery(EJBQueryImpl.java:116)
at org.eclipse.persistence.internal.jpa.EJBQueryImpl.<init>(EJBQueryImpl.java:102)
at org.eclipse.persistence.internal.jpa.EJBQueryImpl.<init>(EJBQueryImpl.java:86)
at org.eclipse.persistence.internal.jpa.EntityManagerImpl.createQuery(EntityManagerImpl.java:1603)
原因と対処
クエリを以下のように変更したところ、結果が取得できるようになりました。
修正後の JQL を記載します。
SELECT
sResult
FROM
SearchResult sResult
INNER JOIN SearchQuery sQuery
ON sResult.searchQueryId = sQuery
INNER JOIN FATagSQueryRelation fATSQRelation
ON sQuery = fATSQRelation.searchQueryId
WHERE
fATSQRelation.festivalArtistTagId.id = 5
フィールド festivalArtistTagId
は エンティティクラスなので、id 指定で検索したい場合は、festivalArtistTagId.id
としないといけないようです。
この辺りは空気を読んでうまい具合に対処してほしいと思いました。
以上です。
コメント