我目前正在尝试评估使用Spring Data JPA的可能性。
在尝试使用投影时,我目前被困在尝试获取特定属性Trying。
我有一个简单的实体,它用外键引用了另一个实体。现在我想为先前的实体定义不同的预测。“原始”属性可以很好地投射到投影界面中,但尝试投射另一个实体/投影会导致它仍然处于延迟加载状态。
现在我想告诉Spring/JPA在projections中急切地加载实体/投影。一种可能的方法是使用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);
}发布于 2018-09-30 04:00:09
我不认为有一种方法可以指示JPA/Hibernate使用投影来急切地获取。该投影是在fetch查询执行之后应用的,因此修改查询为时已晚。
有一个折衷的解决方案,使用启用了FORCE_LAZY_LOADING特性的jackson-datatype-hibernate模块。这会强制初始化并返回投影中所有延迟加载的对象。
请注意,这不如使用实体图或JOIN FETCH编写自定义查询的效率。它的行为与在每个延迟加载的对象上调用Hibernate.initialize、执行另一个select查询的行为相同。因此,它会导致N+1选择。但这可能是一个很好的入门方式。当某些东西开始变慢时,您仍然可以通过编写join-fetch或实体图查询来进行优化。
发布于 2020-06-03 22:41:48
这是一个迟来的答案,但是,我希望它能帮助其他人。
"@EntityGraph“注释可以提供在您的情况下迫切需要加载的用户信息。
没有经过测试,但我猜下面的存储库方法可以适用于您的情况。我不确定您想要的泛型方法实现的实现。
public interface BuyerRepository extends Repository<Buyer, Integer> {
@EntityGraph(attributePaths = {"user"})
List<BuyerCProjection> findProjectedById(Integer id);
}您可以找到有关如何使用实体图here的更详细说明
https://stackoverflow.com/questions/42268920
复制相似问题