Как выбрать частичный объект, включая список с синтаксисом new () в Hibernate - PullRequest
2 голосов
/ 29 июня 2010

В моей спящей системе у меня есть класс Picture, который имеет некоторые простые данные, список установок и некоторые (огромные) двоичные данные.Список Установок реализован с помощью таблицы соединений, так как это отношение ManyToMany и определено на стороне Установки:

@Entity
public class Picture {
  @Id
  private long pictureId;
  private String mimeType;
  @Lob
  @Basic(fetch=FetchType.LAZY) // Don't load all data unless required
  private byte[] picture;

  @ManyToMany(mappedBy= "images")
  private List<Installation> installations;

  /** This should be used only to load partial objects through PictureDao */
  public Picture(long pictureId, String mimeType, List<Installation> insts) {
    this.pictureId = pictureId;
    this.mimeType = mimeType;
    this.installations = insts;
  }
...
}

Конструктор предназначен исключительно для частичного выбора.

Я хотел бы иметь возможность сделать частичный выбор, который включает список Установок, но не данные изображения.Я попробовал очевидное решение:

Query q = em.createQuery("SELECT new Picture" +
  "(p.pictureId, p.mimeType, p.installations) " +
  " FROM Picture p WHERE p.pictureId = :id");

, но он утверждает, что не может найти конструктор.Если я не включаю установки в выборку, поле становится пустым, а не ленивым загрузчиком для списка.Я также попытался присоединиться к p.installations, и он все еще не может найти конструктор.Без списка Установок это работает прекрасно.

Есть ли способ добавить коллекцию в мой частичный выбор?

Спасибо, -Lars

1 Ответ

3 голосов
/ 29 июня 2010

Нельзя использовать коллекционное значение пути-выражения в выражении конструктора. Цитирование спецификации JPA 1.0:

4.8 SELECT Clause

Предложение SELECT обозначает запрос результат. Может быть более одного значения возвращается из предложения SELECT запрос.

Предложение SELECT может содержать один или больше из следующих элементов: переменная одного диапазона или идентификационная переменная, которая колеблется над типом абстрактной схемы объекта, однозначное выражение пути, совокупное выражение выбора, а выражение конструктора.

Предложение SELECT имеет следующее Синтаксис:

select_clause ::= SELECT [DISTINCT] select_expression {, select_expression}*
select_expression ::=
         single_valued_path_expression |
         aggregate_expression |
         identification_variable |
         OBJECT(identification_variable) |
         constructor_expression
constructor_expression ::=
         NEW constructor_name ( constructor_item {, constructor_item}* )
constructor_item ::= single_valued_path_expression | aggregate_expression
aggregate_expression ::=
         { AVG | MAX | MIN | SUM } ([DISTINCT] state_field_path_expression) |
         COUNT ([DISTINCT] identification_variable | state_field_path_expression |
                   single_valued_association_path_expression)

JPA 2.0 дает вам немного больше возможностей для constructor_item (см. этот ответ ), но, тем не менее, вы не сможете пройти путь с коллекцией выражение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...