我正在将一些代码从旧的OpenJPA实现移植到更新的实现,特别是
OpenJPA 2.1.0-SNAPSHOTversion id: OpenJPA的-2.1.0-快照r422266:990238
我以前工作的查询在这个新环境中失败了(稍后确切失败的详细信息),但重新编写查询的工作正常。不同之处在于我从一对多查询的哪一侧开始。我的问题分为两部分:
为了简洁起见,这里的课程相当减少。关系的一面:
@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作为数据库。
答案 0 :(得分:1)
您可能会在此特定版本中遇到一些错误。当我尝试设置OpenJPA fetchSize时,我也得到结果集已关闭错误。 &LT;&GT; 在我的例子中,事实证明OpenJPA query.getResultList()返回一个代理对象,而不是实际的List。因此,如果我在将结果列表返回给客户端之前耗尽结果列表,我就不再遇到问题了。 但是,我们还有另一个问题。只需设置fetchBatchSize会导致OpenJPA产生无效的Query!当然这是一个错误。
答案 1 :(得分:1)
第二个查询不正确,因为标识变量opref
指的是集合(rsm.cwsPubOperationRefs
是集合)而不是单个值。
在JPA 2.0规范中,用以下词语告知:
使用除in之外的collection_valued_path_expression是非法的 除了在一个查询中的查询的FROM子句 empty_collection_comparison_expression,在 collection_member_expression,或作为SIZE运算符的参数。
第一个查询完全正常 - CwsPubOperationRef因为标识变量引用单个值。