Data JPA的可能性.
试图使用Projections,我目前只是试图获取特定属性Eager.
我有一个简单的实体,它使用外键延迟引用另一个实体.我现在想为前一个实体定义不同的预测. “原始”属性很好地投射到投影界面中,但是尝试投影另一个实体/投影会导致它仍然是延迟加载的.
我现在想告诉Spring / JPA急切地在预测中加载实体/投影.一种可能的方法是使用EntityGraphs(它们运行良好),但我必须使用不同的图形为每个方法创建存储库.问题是其他方式有哪些?
例:
实体买方:
@Entity public class Buyer { private Integer id; private String someProperty; private User user; ... @OneToOne( fetch = FetchType.LAZY) @JoinColumn( name = "CAB_USR_ID", referencedColumnName = "ID", updatable = false, nullable = true, foreignKey = @ForeignKey(name = "FK_CAB_USR")) public User getUser() { return user; } public void setUser(User user) { this.user = user; } }
实体用户:
@Entity public class User { private Integer id; private String name; ... }
投影买方
public interface BuyerCProjection { Integer getId(); UserProjection getUser(); }
投影用户
public interface UserProjection { Integer getId(); String getName(); }
我想使用的存储库
public interface BuyerRepository extends Repository<Buyer, Integer> { <T> List<T> findBy(Class<T> t); }
我认为没有办法指示JPA / Hibernate急切地使用投影获取.在执行获取查询后应用投影,因此修改查询为时已晚.
使用 jackson-datatype-hibernate 模块并启用了FORCE_LAZY_LOADING功能,这是一个妥协的解决方案.这会强制初始化并返回投影中所有延迟加载的对象.
请注意,这不如使用实体图或JOIN FETCH编写自定义查询有效.它的行为与在每个延迟加载的对象上调用Hibernate.initialize,执行另一个select查询相同.因此它导致N 1选择.但它可能是一个很好的入门方式.当某些事情开始变慢时,您仍然可以通过编写join-fetch或实体图形查询进行优化.
翻译自:https://stackoverflow.com/questions/42268920/fetch-lazy-properties-in-spring-projections