JPA查询,oneToMany或manyToOne,都应该有效吗?

时间:2011-01-31 16:02:14

标签: java jpa openjpa

我正在将一些代码从旧的OpenJPA实现移植到更新的实现,特别是

  

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

我以前工作的查询在这个新环境中失败了(稍后确切失败的详细信息),但重新编写查询的工作正常。不同之处在于我从一对多查询的哪一侧开始。我的问题分为两部分:

  1. 是否有“正确”的一面可以从中开始这样的查询?我们希望这两个查询都有效吗?
  2. 如果我们希望两者都有效,我们能否解释一下我所看到的失败。
  3. 为了简洁起见,这里的课程相当减少。关系的一面:

    @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
    

    我在Windows上运行WebSphere 8.0,使用DB2作为数据库。

2 个答案:

答案 0 :(得分:1)

您可能会在此特定版本中遇到一些错误。当我尝试设置OpenJPA fetchSize时,我也得到结果集已关闭错误。 &LT;&GT; 在我的例子中,事实证明OpenJPA query.getResultList()返回一个代理对象,而不是实际的List。因此,如果我在将结果列表返回给客户端之前耗尽结果列表,我就不再遇到问题了。 但是,我们还有另一个问题。只需设置fetchBatchSize会导致OpenJPA产生无效的Query!当然这是一个错误。

答案 1 :(得分:1)

第二个查询不正确,因为标识变量opref指的是集合(rsm.cwsPubOperationRefs是集合)而不是单个值。

在JPA 2.0规范中,用以下词语告知:

  

使用除in之外的collection_valued_pa​​th_expression是非法的   除了在一个查询中的查询的FROM子句   empty_collection_comparison_expression,在   collection_member_expression,或作为SIZE运算符的参数。

第一个查询完全正常 - CwsPubOperationRef因为标识变量引用单个值。