首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JPA查询,oneToMany或manyToOne,两者都应该工作吗?

JPA查询,oneToMany或manyToOne,两者都应该工作吗?
EN

Stack Overflow用户
提问于 2011-01-31 16:02:14
回答 2查看 2.1K关注 0票数 3

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

OpenJPA 2.1.0-SNAPSHOTversion id: openjpa-2.1.0-快照-r422266:990238

我以前工作过的查询在这个新环境中失败了(稍后准确失败的详细信息),但是重定向查询工作得很好。不同之处在于我开始的一对多查询的哪一边。我的问题分两部分:

  1. 是否有“正确”的一面来开始这样的查询?我们希望这两种查询都能工作吗?
  2. ,如果我们希望两者都能工作的话,我们能解释一下我看到的失败吗。

为了简洁起见,这里的类是相当少的。关系的一方:

代码语言:javascript
复制
@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;

}

另一边

代码语言:javascript
复制
   @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 ...
    }

工作的查询:

代码语言:javascript
复制
 <named-query name="good"> <query>   
      SELECT opref FROM CwsPubOperationRef opref
            JOIN opref.cwsMd rsm
            WHERE rsm.rsmId = :rsmId                                                      
  </query>
 </named-query>

那个没有

代码语言:javascript
复制
  <named-query name="bad"> <query>   
         SELECT opref FROM CwsMd rsm
            JOIN rsm.cwsPubOperationRefs opref
            WHERE rsm.rsmId = :rsmId
     </query> </named-query>

我得到的错误是

代码语言:javascript
复制
 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作为数据库。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-08-08 17:46:48

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

在JPA2.0规范中,这是用以下几个词描述的:

在查询的FROM子句之外使用collection_valued_path_expression是非法的,但empty_collection_comparison_expression、collection_member_expression或SIZE运算符的参数除外。

第一个查询非常好-- CwsPubOperationRef,因为标识变量指的是单个值。

票数 1
EN

Stack Overflow用户

发布于 2011-02-11 01:07:20

在这个特定的版本中,您可能遇到了一些错误。当我试图设置OpenJPA fetchSize时,我也得到了结果集是封闭错误。在我的例子中,<>结果是OpenJPA query.getResultList()返回一个代理对象,而不是实际的列表。因此,如果在将结果列表返回给客户端之前耗尽了结果列表,那么我就不再遇到问题了。然而,我们还有另一个问题。只要设置fetchBatchSize,OpenJPA就会产生一个无效的查询!当然是个窃听器。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4853023

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档