2011-01-31 112 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