У меня небольшая проблема.Давайте предположим, что у меня есть этот объект:
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 с полями геометрии, и геометрия может быть очень большой. Поэтому, если я загружаю много сущностей, она становитсямедленно. В некоторых ситуациях я не хочу загружать эти поля.