【问题标题】:How to use FetchMode.JOIN with JPA?如何将 FetchMode.JOIN 与 JPA 一起使用?
【发布时间】:2017-03-31 11:33:58
【问题描述】:

我正在使用 Spring Boot、JPA 和 Hibernate。我有以下实体User,它与roles 有关系:

@Table
public class User {

    @OneToMany(fetch = EAGER)
    @JoinColumn(name = "role_id")
    private Set<Role> roles;

    // ...

}

当我读取用户时,hibernate 会为每个附加角色生成一个选择,而不是使用联接。在纯 Hibernate 中,我会通过添加

来解决这个问题
@Fetch(FetchMode.JOIN)

但这似乎没有任何作用。

是否可以为有关此实体的所有查询设置首选获取模式?

我找到了一个解决方法,我真的认为这是一种解决方法,因为我需要为每个查询指定它,是这样的:

public List<User> findById(long userId){

        Specification<User> spec = (root, criteriaQuery, criteriaBuilder) ->
        {
            criteriaQuery.distinct(true);
            root.fetch("roles", JoinType.LEFT);
            return criteriaBuilder.equal(root.get("id"), userId);
        };

        return repository.findAll(spec);
    } 

【问题讨论】:

  • 在 JPA 中没有可移植的方式来强制获取模式。话虽如此,我很惊讶@Fetch 没有效果,在这种情况下它确实应该有效。
  • @crizzis 我相信在使用基于条件的查询时,@FetchMode 可能会被忽略。它可能仅在使用 find-by-id 时适用。
  • 蒂姆,你试过用@BatchSize吗?
  • @Naros 我以为 OP 的意思是 @Fetch 没有效果根本,但也许不是这样
  • 是的,我的意思是@Fetch 无效。我认为这是因为我们使用 JPA 类/注释并且只是混合休眠注释没有效果,但你听起来好像我错了。是的,我之前使用过repository.findById,而不是 Criteria API。

标签: hibernate jpa spring-data spring-data-jpa


【解决方案1】:

这件事很晚了, 但您需要定义父实体和相关实体之间的连接

Join<MyEntity, RelatedEntity> join = root.join("relatedEntity");
root.fetch("relatedEntity");

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-12-09
    • 2018-10-22
    • 1970-01-01
    • 2013-03-05
    • 2019-02-09
    • 2015-03-01
    • 2020-11-19
    • 1970-01-01
    相关资源
    最近更新 更多