Java JPA查询,oneToMany还是manyToOne,两者都应该工作吗?
我正在将一些代码从一个旧的OpenJPA实现移植到一个更新的OpenJPA实现,特别是 OpenJPA 2.1.0-Snapshot版本id: openjpa-2.1.0-SNAPSHOT-r422266:990238 我以前的工作查询在这个新环境中失败了(稍后将详细介绍具体的失败情况),但重新编译查询的效果很好。区别在于我从一对多查询的哪一侧开始。我的问题分为两部分:Java JPA查询,oneToMany还是manyToOne,两者都应该工作吗?,java,jpa,openjpa,Java,Jpa,Openjpa,我正在将一些代码从一个旧的OpenJPA实现移植到一个更新的OpenJPA实现,特别是 OpenJPA 2.1.0-Snapshot版本id: openjpa-2.1.0-SNAPSHOT-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;
}
有效的查询:
<named-query name="good"> <query>
SELECT opref FROM CwsPubOperationRef opref
JOIN opref.cwsMd rsm
WHERE rsm.rsmId = :rsmId
</query>
</named-query>
我在Windows上运行WebSphere 8.0,使用DB2作为数据库。在这个特定版本中,您可能遇到了一些错误。当我试图设置OpenJPA fetchSize时,我也得到了结果集为closed的错误。 在我的例子中,OpenJPA query.getResultList()返回一个代理对象,而不是实际的列表。因此,如果我在将结果列表返回给客户机之前耗尽了它,我就不会再遇到问题。
然而,我们还有另一个问题。只需设置fetchBatchSize,OpenJPA就会生成一个无效的查询!。当然,这是一个错误 第二个查询不正确,因为标识变量
opref
引用集合(rsm.cwspubooperationrefs
是集合),而不是单个值
在JPA 2.0规范中,这是通过以下文字来说明的:
在中以外的位置使用集合\值\路径\表达式是非法的
查询的FROM子句,但在
空的\u集合\u比较\u表达式,在
集合\成员\表达式,或作为大小运算符的参数
第一个查询非常好-CwsPubOperationRef,因为标识变量引用单个值 我认为你是对的,但最好能确切地知道。
<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