问题描述
我有两个具有多对一关系的简单类
public class User {
Long id;
String name;
...
(getters,setters,methods)
}
public class Item {
Long id;
String name;
@ManyToOne(cascade = PERSIST,fetch = LAZY,optional = false)
User user;
...
(getters,methods)
}
我想加入左联接。我已经尝试过了:
Subquery<Long> subquery = query.subquery(Long.class)
Root<User> root = subquery.from(User .class);
Join<User,Item> join = root.join("user",JoinType.LEFT);
但是它引发了一个例外,那就是User中没有“ user”,我理解为什么。 如何做到这一点?
解决方法
您需要有类似的东西
Join<Item,User> userJoin = root.join(Item_.user,JoinType.LEFT);
,然后您可以将userJoin.get(...)
与criteriaBuilder
一起使用
具有规格的完整示例:
public static Specification<Item> methodName() {
return new Specification<Item>() {
@Override
public Predicate toPredicate(Root<Item> root,CriteriaQuery criteriaQuery,CriteriaBuilder criteriaBuilder) {
Join<Item,JoinType.LEFT);
return criteriaBuilder.isTrue(
criteriaBuilder.and(
criteriaBuilder.equal(userJoin.get(User_.id),1),criteriaBuilder.equal(root.get(Item_.name),userJoin.get(User_.name))
)
);
}
}
}
,
尝试加入属于您根目录的列。 要么
Root<User> userRoot = ...
userRoot.join("items",JoinType.RIGHT);
或
Root<Item> itemRoot = ...
itemRoot.join("user",JoinType.LEFT);