2011-01-31 62 views
3

我移植從舊OpenJPA實現以更近的一個部分代碼,專門JPA查詢,oneToMany或manyToOne,都應該工作?

OpenJPA的2.1.0-SNAPSHOTversion ID: OpenJPA的-2.1.0-快照r422266:990238

我以前的工作查詢在這個新的環境中失敗(稍後的確切失敗的細節),但重新查詢工作得很好。區別在於我開始的一對多查詢的哪一方。我的問題分爲兩部分:

  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> 

的錯誤我得到的是

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

我在使用DB2作爲數據庫的Windows上的WebSphere 8.0上運行。

回答

1

第二個查詢是不正確的,因爲標識變量opref指集合(rsm.cwsPubOperationRefs是集合)而不是單個值。

在JPA 2.0規範,這是告訴與下面的話:

是非法的在 中的 empty_collection_comparison_expression使用其他一個collection_valued_pa​​th_expression比從查詢的子句除外,在 collection_member_expression,或作爲SIZE算子的一個參數。

第一個查詢非常好 - CwsPubOperationRef因爲標識變量指的是單個值。

1

你可能會在這個特定版本中遇到一些錯誤。當我嘗試設置OpenJPA fetchSize時,我也收到Result set被關閉的錯誤。 <> 就我而言,事實證明,OpenJPA query.getResultList()返回一個代理對象,而不是實際的List。所以,如果我在將結果列表返回給客戶之前耗盡了結果列表,我不會再遇到問題。 但是,我們有另一個問題。只要設置fetchBatchSize,OpenJPA就會產生一個無效的查詢!當然,這是一個錯誤。

+0

我認爲你是對的,但最好明確地知道。 – djna 2011-02-11 23:45:30

相關問題