【发布时间】: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