Spring Data有条件地获取子项

时间:2017-03-05 13:43:59

标签: java jpa spring-data

我已阅读Spring Data JPARepository: How to conditionally fetch children entites。 但我想使用方便的JPA注释而不是手动加入所有孩子。

说我有以下型号:

@Entity
public class UserModel extends BaseModel<User> {

    @OneToMany(mappedBy = "user", cascade = CascadeType.ALL, fetch = FetchType.LAZY)
    private List<CredentialModel> credentialList = new ArrayList<>();

    @ManyToMany
    @JoinTable(
            name = "users_actions",
            joinColumns = @JoinColumn(name = "user_id", referencedColumnName = "id"),
            inverseJoinColumns = @JoinColumn(name = "action_id", referencedColumnName = "id")
    )
    private List<ActionMode> actionList = new ArrayList<>();
}

获取credentialListactionList可能是一项耗时的操作(连接提取等)。我不想自动提取credentialList也不想actionList。但是当我访问它们时,我希望它们是一个空列表,而不是LazyInitializationException

即使我在JOIN FETCH中没有专门@Query这些字段,我也可以使用这些字段。只需将其留空即可。

如果没有,无论如何都有同样的需求吗?

2 个答案:

答案 0 :(得分:3)

返回空集合会导致出现问题:您无法区分真正空的集合和一个只是懒得加载的集合。 您可以在通过org.hibernate.Hibernate.isInitialized(...)或访问集合之前检查集合 JPA2中的PersistenceUnitUtil#isLoaded(...)

但是我建议您此时使用数据传输对象。 对于不需要集合的特殊用例,只需构建一个类似的实体副本,而不需要那些不必要的属性。当然,你的DTO大楼必须在公开会议中完成。

答案 1 :(得分:0)

我认为你正在尝试JOIN而不是FETCH,可能只是在where条件中使用子对象的属性。我想这样的东西可以在JPQL中使用。

@Query("Select u from UserModel u INNER JOIN u.credentialList c
 INNER JOIN u.actionList a")