jpql не загружает Blob - PullRequest
       20

jpql не загружает Blob

2 голосов
/ 25 августа 2010
@Entity
@NamedQueries({
    @NamedQuery(name = "Item.findAll", query = "select i from Item i"),
})
public class Item implements Serializable, WithId, WithNameDescription {
    @Lob
    byte[] photo;
    @OneToOne(cascade = CascadeType.ALL, orphanRemoval = true)
    TextualInfo english = new TextualInfo();
// more entry field, getters and setters
}

Когда я вызываю Запрос Item.findAll, я предполагаю, что все байты [] попадают в память. Но я не буду использовать это. Так что я не хочу получать это. Есть ли способ, как указать тот факт, что я хочу лениво загрузить фотографию в запросе jpql ?

Ответы [ 2 ]

0 голосов
/ 10 июля 2014

В EclipseLink вы можете контролировать это с помощью FetchGroups.Чтобы использовать его, добавьте специфическую аннотацию FetchGroup EclipseLink поверх класса сущности, например:

@Entity
@Table(name="person")
@FetchGroup(name="personWithNoBlobs",attributes={@FetchAttribute(name="firstName"),@FetchAttribute(name="lastName"),@FetchAttribute(name="address")})
public class Person

Либо необходимо включить ткачество, либо класс Entity должен реализовать интерфейс FetchGroupTracker, предоставляемый EclipseLink.,Чтобы использовать группу выборки в JPQL, используйте:

query.setHint(QueryHints.FETCH_GROUP_NAME, "personWithNoBlobs");
0 голосов
/ 26 августа 2010

По умолчанию постоянные свойства загружаются с нетерпением, и вы не можете управлять этим из JPQL.Однако вы можете попробовать , чтобы изменить поведение по умолчанию и сделать photo ленивым с аннотацией Basic.Из спецификации JPA:

9.1.18 Основная аннотация

Основная аннотация - это простейший тип отображения на столбец базы данных.Аннотация Basic может быть применена к постоянному свойству или переменной экземпляра любого из следующих типов: примитивные типы Java, обертки примитивных типов, java.lang.String, java.math.BigInteger, java.math.BigDecimal, java.util.Date, java.util.Calendar, java.sql.Date, java.sql.Time, java.sql.Timestamp, byte [], Byte [], char [], Character [], enums и любые другие типы.который реализует Сериализуемый.Как описано в разделе 2.1.6, использование основной аннотации является необязательным для постоянных полей и свойств этих типов.

@Target({METHOD, FIELD}) @Retention(RUNTIME)
public @interface Basic {
FetchType fetch() default EAGER;
boolean optional() default true;

Перечисление FetchType определяет стратегии получения данных из базы данных:

public enum FetchType { LAZY, EAGER };

Стратегия EAGER - это требование времени выполнения провайдера постоянства, что данные должны извлекаться с нетерпением.Стратегия LAZY - это подсказка для среды выполнения персистентного провайдера о том, что данные должны извлекаться лениво при первом обращении к ним.Внедрение позволяет быстро получать данные, для которых была указана стратегия LAZY.В частности, отложенная выборка может быть доступна только для Basic отображений, для которых используется доступ на основе свойств.

Примерно так:

@Lob @Basic(fetch=LAZY)
public byte[] getPhoto() { return photo; }

Но, как упоминалось вspec, это просто подсказка и может не поддерживаться.В этом случае альтернативой может быть использование лениво загруженной обязательной однозначной ассоциации с другим объектом (содержащим большой двоичный объект).

Ссылки

  • Спецификация JPA 1.0
    • Раздел 9.1.18 «Основные аннотации»
    • Раздел 9.1.19 «Аннотация аннотаций»
...