首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Spring Projections中获取惰性属性

在Spring Projections中获取惰性属性
EN

Stack Overflow用户
提问于 2017-02-16 16:48:30
回答 2查看 2.8K关注 0票数 17

我目前正在尝试评估使用Spring Data JPA的可能性。

在尝试使用投影时,我目前被困在尝试获取特定属性Trying。

我有一个简单的实体,它用外键引用了另一个实体。现在我想为先前的实体定义不同的预测。“原始”属性可以很好地投射到投影界面中,但尝试投射另一个实体/投影会导致它仍然处于延迟加载状态。

现在我想告诉Spring/JPA在projections中急切地加载实体/投影。一种可能的方法是使用EntityGraphs (它们工作得很好),但我必须使用不同的图为每个方法创建存储库。问题是,还有哪些其他方法?

示例:

实体买家:

代码语言:javascript
复制
@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;
    }
}

实体用户:

代码语言:javascript
复制
@Entity
public class User {

    private Integer id;
    private String name;

    ...

}

预测购买者

代码语言:javascript
复制
public interface BuyerCProjection {
    Integer getId();
    UserProjection getUser();
}

投影用户

代码语言:javascript
复制
public interface UserProjection {

    Integer getId();
    String getName();
}

我想使用的存储库

代码语言:javascript
复制
public interface BuyerRepository extends Repository<Buyer, Integer> {

    <T> List<T> findBy(Class<T> t);
}
EN

回答 2

Stack Overflow用户

发布于 2018-09-30 04:00:09

我不认为有一种方法可以指示JPA/Hibernate使用投影来急切地获取。该投影是在fetch查询执行之后应用的,因此修改查询为时已晚。

有一个折衷的解决方案,使用启用了FORCE_LAZY_LOADING特性的jackson-datatype-hibernate模块。这会强制初始化并返回投影中所有延迟加载的对象。

请注意,这不如使用实体图或JOIN FETCH编写自定义查询的效率。它的行为与在每个延迟加载的对象上调用Hibernate.initialize、执行另一个select查询的行为相同。因此,它会导致N+1选择。但这可能是一个很好的入门方式。当某些东西开始变慢时,您仍然可以通过编写join-fetch或实体图查询来进行优化。

票数 1
EN

Stack Overflow用户

发布于 2020-06-03 22:41:48

这是一个迟来的答案,但是,我希望它能帮助其他人。

"@EntityGraph“注释可以提供在您的情况下迫切需要加载的用户信息。

没有经过测试,但我猜下面的存储库方法可以适用于您的情况。我不确定您想要的泛型方法实现的实现。

代码语言:javascript
复制
public interface BuyerRepository extends Repository<Buyer, Integer> {

    @EntityGraph(attributePaths = {"user"})
    List<BuyerCProjection> findProjectedById(Integer id);
}

您可以找到有关如何使用实体图here的更详细说明

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42268920

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档