0

WebSphere Application Server 8 で OpenJPA 2.1 を使用しています。次のような双方向の oneToMay リレーションがあります。

@Entity(name = "table1")
public class Table1  {
    @Id
    @Column(columnDefinition = "DATE")
    private Date date;
    @OneToMany(mappedBy = "date", targetEntity = Table2.class, fetch = FetchType.LAZY, cascade = CascadeType.PERSIST)
    private List<Table2> table2List;
}

@Entity(name = "table2")
public class Tabl2{
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private long id;

    @ManyToOne(cascade = CascadeType.ALL)
    @JoinColumn(name = "fk_date", nullable = false)
    private Table1 table1;

    @Column(name = "value", nullable = false, columnDefinition = "INT")
    private int value;

}

今、次のような table2 の条件で table1 エンティティ全体を選択したいと思います。

TypedQuery<WeekBean> q = em.createQuery(
    "SELECT t1 from table1 t1 JOIN FETCH t1.table2List t2 WHERE t2.value = :value",
    t1.class);

しかし、ArgumentException が発生するため、これは機能しません。

Exception in thread "main" <openjpa-2.1.1-SNAPSHOT-r422266:1141200 nonfatal user error> org.apache.openjpa.persistence.ArgumentException: " Encountered "f" at character 50, but expected [",", ".", "GROUP", "HAVING", "INNER", "JOIN", "LEFT", "ORDER", "WHERE", <EOF>]." 
    at org.apache.openjpa.kernel.jpql.JPQLParser.parse(JPQLParser.java:51)
    at org.apache.openjpa.kernel.ExpressionStoreQuery.newCompilation(ExpressionStoreQuery.java:154)
    at org.apache.openjpa.datacache.QueryCacheStoreQuery.newCompilation(QueryCacheStoreQuery.java:262)
    at org.apache.openjpa.kernel.QueryImpl.newCompilation(QueryImpl.java:672)
    at org.apache.openjpa.kernel.QueryImpl.compilationFromCache(QueryImpl.java:654)
    at org.apache.openjpa.kernel.QueryImpl.compileForCompilation(QueryImpl.java:620)
    at org.apache.openjpa.kernel.QueryImpl.compileForExecutor(QueryImpl.java:682)
    at org.apache.openjpa.kernel.QueryImpl.compile(QueryImpl.java:589)
    at org.apache.openjpa.persistence.EntityManagerImpl.createQuery(EntityManagerImpl.java:996)
    at com.ibm.ws.persistence.EntityManagerImpl.createQuery(EntityManagerImpl.java:107)
    at com.ibm.ws.persistence.EntityManagerImpl.createQuery(EntityManagerImpl.java:86)
    at com.ibm.ws.persistence.EntityManagerImpl.createQuery(EntityManagerImpl.java:34)
    at org.apache.openjpa.persistence.EntityManagerImpl.createQuery(EntityManagerImpl.java:974)

コレクションの条件で JOIN FETCH を使用するにはどうすればよいですか?

宜しくお願いします

4

1 に答える 1

3

JPA 2.0 仕様によると、そのような構成はサポートされておらず、OpenJPA もベンダー拡張機能として機能を提供していないようです。

FETCH JOIN 句の右側で参照される関連付けは、クエリの結果として返されるエンティティに属する関連付けである必要があります。FETCH JOIN 句の右側で参照されるエンティティの識別変数を指定することは許可されていないため、暗黙的にフェッチされたエンティティへの参照をクエリの他の場所に表示することはできません。

あなたの場合、これは定義できないことを意味しt2、結果として WHERE 句で使用できません。

于 2012-07-19T07:17:55.493 に答える