2011-01-31 6 views
3

私は、具体的JPAクエリー、oneToManyまたはmanyToOneは両方とも機能するはずですか?

のOpenJPA 2.1.0-SNAPSHOTversion IDに、より最新のものに古いOpenJPAの実装からいくつかのコードを移植しています: のOpenJPA-2.1.0-SNAPSHOT-r422266:990238

私の以前の動作中のクエリはこの新しい環境で失敗しましたが(正確なエラーの詳細は後で説明します)、クエリの再作成はうまくいきました。違いは、私が最初から始まる一対多問合せのどちらの側にあるかです。私の質問は2つの部分に分かれています:

  1. このようなクエリを開始する「正しい」側はありますか?両方のクエリがうまくいくと思いますか?
  2. 私たち両方がうまくいくと思うなら、私が見ている失敗を説明できますか?

簡潔にするため、ここのクラスはむしろ削減されています。関係の片側:

@Entity 
@Table(name="CWS_MDS") 
public class CwsMd implements Serializable { 

    @Id 
    Column(name="RSM_ID", unique=true, nullable=false, length=128) 
    private String rsmId; 

    // ... many elisions ... 

    //bi-directional many-to-one association to CwsPubOperationRef 
    @OneToMany(mappedBy="cwsMd") 
    private Set<CwsPubOperationRef> cwsPubOperationRefs; 

} 

働く反対側

@Entity 
    @Table(name="CWS_PUB_OPERATION_REF") 
    public class CwsPubOperationRef implements Serializable { 

    @EmbeddedId 
    private CwsPubOperationRefPK id; 

//bi-directional many-to-one association to CwsMd 
    @ManyToOne 
    @JoinColumn(name="RSM_ID", nullable=false, insertable=false, updatable=false) 
    private CwsMd cwsMd; 

    // ... more elisions ... 
    } 

クエリ:

<named-query name="good"> <query> 
     SELECT opref FROM CwsPubOperationRef opref 
      JOIN opref.cwsMd rsm 
      WHERE rsm.rsmId = :rsmId              
    </query> 
</named-query> 

ない

<named-query name="bad"> <query> 
     SELECT opref FROM CwsMd rsm 
      JOIN rsm.cwsPubOperationRefs opref 
      WHERE rsm.rsmId = :rsmId 
    </query> </named-query> 

エラーをしている1私は

です
org.apache.openjpa.persistence.PersistenceException: [jcc][t4][10120][10898][3.57.82] 
Invalid operation: result set is closed. ERRORCODE=-4470, SQLSTATE=null 

私はWebSphere 8.0、WindowsではDB2をデータベースとして使用しています。

答えて

1

識別変数oprefはコレクション(rsm.cwsPubOperationRefsがコレクション)を参照しており、単一の値ではないため、2番目のクエリが正しくありません。

JPAで

これは、次の言葉で言われる2.0仕様:

collection_member_expressionに、 empty_collection_comparison_expressionで除き、クエリのFROM句 以外collection_valued_pa​​th_expressionを使用することは違法であるか、またはSIZE演算子の引数として使用します。

最初のクエリは、識別変数が単一の値を参照するため、CwsPubOperationRefは完全に良好です。

1

この特定のバージョンではいくつかのバグが発生している可能性があります。私はまた、OpenJPA fetchSizeを設定しようとすると、結果セットがクローズエラーになっています。 <> 私の場合、OpenJPA query.getResultList()は実際のリストではなくプロキシオブジェクトを返します。だから、クライアントに返す前に結果リストを使い果たしても、私はもはや問題には当たらない。 しかし、別の問題があります。 fetchBatchSizeを設定するだけで、OpenJPAは無効なクエリを生成します。確かにそれはバグです。

+0

私はあなたが正しいと思うが、決定的に知ることは良いことだ。 – djna

関連する問題