如何编写一个规范来急切地获取一个懒惰的多多关系?



以前可能有人问过这个问题,但我似乎不太明白。

我在用户和角色之间有一个更复杂的manymany关系。链接表有更多的属性,所以它本身就是一个实体。

映射被定义为惰性映射,因为在大多数情况下,我不想与用户一起获取角色。但是,当然,有一个用例,我宁愿在单个查询中同时获取角色和用户。

Userclass:

@Entity
public class User {
[...]  // other attributes
@OneToMany(mappedBy = "user", cascade = CascadeType.ALL, orphanRemoval = true, fetch = FetchType.LAZY)
private Set<User2Role> userToRoles = new HashSet<>();
[...] // getters and setters
}

链接实体:

@Entity
public class User2Role {
@ManyToOne
private User user;
@ManyToOne
private Role role;
[...] // getters, setters and other attributes
}

当然还有Role课(内容不相关)。

目前为止我有什么:

Specification<User> specification = Specification.where(null);
specification.and((user, query, cb) -> {
if (Long.class != query.getResultType()) {
user.fetch(User_.userToRoles, JoinType.LEFT).fetch(User2Role_.role, JoinType.LEFT);
}
return null;
});
[...]  // other conditions

我错过了什么?请注意,我不想过滤Role的任何属性,只过滤User属性,但希望(在UI中)与用户一起显示角色。

我只是需要一个短暂的休息来清理我的头脑,找出我犯的愚蠢的错误,我没有看到:)

但是为了给某人节省几个小时的时间来看这些东西,Specification.and()不会改变如果指定Specification对象,则返回一个新对象。

所以,正确的代码是:
Specification<User> specification = Specification.where(null);
specification = specification.and((user, query, cb) -> {
if (Long.class != query.getResultType()) {
user.fetch(User_.userToRoles, JoinType.LEFT).fetch(User2Role_.role, JoinType.LEFT);
}
return null;
});

最新更新