Java JPA查询,oneToMany还是manyToOne,两者都应该工作吗?

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 我以前的工作查询在这个新环境中失败了(稍后将详细介绍具体的失败情况),但重新编译查询的效果很好。区别在于我从一对多查询的哪一侧开始。我的问题分为两部分: 是否有一个“正确”的方面来开始这样的查询?我们希望这两个查询都能工作吗 如果我们希望两者都能起作用,我们能解释一下我看到的失败

我正在将一些代码从一个旧的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