Spring Data Projection загружает дополнительные поля - PullRequest
0 голосов
/ 14 декабря 2018

У меня небольшая проблема.Давайте предположим, что у меня есть этот объект:

import lombok.Data;
import javax.persistence.*;
import java.util.Set;

@Data
@Entity
public class Person {

    enum SEX {F, M}

    @Id
    @GeneratedValue
    private Long id;

    @OrderBy
    @Enumerated(EnumType.STRING)
    @ElementCollection(fetch = FetchType.EAGER)
    private Set<SEX> sexes;

    private String firstName;
    private String lastName;
}

Поскольку в некоторых моментах я не хочу загружать имя и фамилию, я использую проекции (https://docs.spring.io/spring-data/jpa/docs/1.10.2.RELEASE/reference/html/#projections): Я определяю этот интерфейс:

import java.util.Set;

public interface PersonSlim {

    String getId();
    Set<Person.SEX> getSexes();
}

Теперь взгляните на этот репозиторий:

import org.springframework.data.repository.CrudRepository;

import java.util.List;

public interface PersonRepo extends CrudRepository<Person, Long> {

    List<PersonSlim> getAllBy();
}

Если вы включите ведение журнала SQL (logging.level.org.hibernate.SQL: DEBUG) и выполните вызов personRepo.getAllBy();, вы увидите:

2018-12-14 16:36:36.808 DEBUG 14227 --- [           main] org.hibernate.SQL                        : select person0_.id as id1_0_, person0_.first_name as first_na2_0_, person0_.last_name as last_nam3_0_ from person person0_

Таким образом, Spring загружает все поля. Если исключить метод getSexes() в интерфейсе PersonSlim, Spring будет загружать только идентификатор:

2018-12-14 16:38:03.977 DEBUG 14382 --- [           main] org.hibernate.SQL                        : select person0_.id as col_0_0_ from person person0_

Spring загружает все поля, если моя проекция содержитElementCollection.

Почему это проблема?
Я использую PostGIS-DB с полями геометрии, и геометрия может быть очень большой. Поэтому, если я загружаю много сущностей, она становитсямедленно. В некоторых ситуациях я не хочу загружать эти поля.

Ответы [ 2 ]

0 голосов
/ 14 декабря 2018

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

Я считаю , что он добавляет слой абстракции над самим фактическим объектом, что скорее всего получить все столбцы, но только выставить горстку.

Учитывая, что сущность управляет запросом для части most , создавая отдельнуюЕсли вы хотите отодвинуть только те столбцы, которые вам нужны, вероятно, будет наиболее целесообразным способом сделать это.Это также отвлечет вас от соблазна приведения на Person, когда вы захотите использовать полностью увлажненную сущность в одном или двух местах.

0 голосов
/ 14 декабря 2018

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

Здесь уже есть проблема https://jira.spring.io/browse/DATAJPA-1218, и это звучит из проблемы, чтоэто не может быть решено с помощью прогнозов на данный момент.

Это может быть полезно для вас https://github.com/Blazebit/blaze-persistence, документировано здесь Представления сущностей

Использует реализацию, аналогичную проекциям.

...