3

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

OpenJPA 2.1.0-SNAPSHOT 版本 ID:openjpa-2.1.0-SNAPSHOT-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

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

4

2 回答 2

1

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

在 JPA 2.0 规范中,这是用以下词语来说明的:

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

第一个查询非常好 - CwsPubOperationRef 因为标识变量引用单个值。

于 2013-08-08T17:46:48.620 回答
1

您可能在这个特定版本中遇到了一些错误。当我尝试设置 OpenJPA fetchSize 时,我也收到 Result set is closed 错误。<> 在我的例子中,事实证明 OpenJPA query.getResultList() 返回一个代理对象,而不是实际的列表。所以,如果我在将结果列表返回给客户端之前用尽了结果列表,我就不再遇到问题了。然而,我们还有另一个问题。只需设置 fetchBatchSize 就会导致 OpenJPA 生成一个无效的查询!。当然这是一个错误。

于 2011-02-11T01:07:20.183 回答