春季如何使用ManyToOne制作左联接条件api?

问题描述

我有两个具有多对一关系的简单类

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);