【问题标题】:JPA query, oneToMany or manyToOne, should both work?JPA 查询 oneToMany 或 manyToOne 都应该工作吗?
【发布时间】:2011-06-18 16:33:45
【问题描述】:

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

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

【问题讨论】:

    标签: java jpa openjpa


    【解决方案1】:

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

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

    使用集合值路径表达式是非法的 查询的 FROM 子句,但在 empty_collection_comparison_expression,在一个 collection_member_expression,或作为 SIZE 运算符的参数。

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 我认为你是对的,但最好能明确地知道。
      猜你喜欢
      • 2016-11-14
      • 1970-01-01
      • 2023-03-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多