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しないといけないようです。
この辺りは空気を読んでうまい具合に対処してほしいと思いました。
以上です。

コメント