【发布时间】:2019-05-15 22:03:09
【问题描述】:
我有一个小问题。 假设我有这个实体:
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;
}
因为在某些时候我不想加载名字和姓氏,所以我使用 Projections (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 会加载所有字段。如果在 PersonSlim 接口中排除 getSexes() 方法,Spring 只会加载 id:
2018-12-14 16:38:03.977 DEBUG 14382 --- [ main] org.hibernate.SQL : select person0_.id as col_0_0_ from person person0_
如果我的投影包含 ElementCollection,则 Spring 会加载所有字段。
为什么会有这样的问题?
我使用带有几何字段的 PostGIS-DB,几何可能非常大。因此,如果我加载许多实体,它会变得很慢。在某些情况下,我不想加载此字段。
【问题讨论】:
标签: java spring spring-data-jpa spring-data