JPA-запрос, oneToMany или manyToOne, должен работать? - PullRequest
3 голосов
/ 31 января 2011

Я портирую некоторый код из старой реализации OpenJPA на более новую, в частности

OpenJPA 2.1.0-SNAPSHOTversion 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 в качестве базы данных.

Ответы [ 2 ]

1 голос
/ 08 августа 2013

Второй запрос неверен, поскольку идентификационная переменная opref относится к коллекции (rsm.cwsPubOperationRefs - коллекция), а не к одному значению.

В спецификации JPA 2.0 это сказано со следующими словами:

Недопустимо использовать выражение collection_valued_path_expression, отличное от предложения FROM запроса, за исключением выражения empty_collection_comparison_expression, collection_member_expression или аргумента оператора SIZE.

Сначалазапрос в порядке - CwsPubOperationRef, потому что переменная идентификации ссылается на одно значение.

1 голос
/ 11 февраля 2011

Возможно, вы столкнулись с какой-то ошибкой в ​​этой конкретной версии.Я также получаю Result set closed error при попытке установить OpenJPA fetchSize.<> В моем случае оказывается, что OpenJPA query.getResultList () возвращает объект прокси, а не фактический список.Итак, если я исчерпал список результатов до того, как вернуть его клиенту, я больше не столкнулся с проблемой.Однако у нас есть другая проблема.Просто установив fetchBatchSize, вы заставляете OpenJPA выдавать недопустимый запрос!Конечно, это ошибка.

...