如何避免 Spring Data Jpa 在简单选择上进行连接?

ele*_*hts 4 java spring jpa

我有带有 @ManyToOne 链接的实体,当我使用条件执行查询时,spring 使用交叉联接,但我只想在自己的列上选择。

案子:

public class Job {

   @Column
   private Long jobId;

   @OneToMany(fetch = FetchType.EAGER)
   @JoinColumn(name="creator", referencedColumnName="uid")
   private User creator;

}

public class User {


   @Column
   private Long uid;

   @Column
   private String name;

}

public Predicate toPredicate(Root<Job> root, CriteriaQuery<?> query, CriteriaBuilder cb) {
    List<Predicate> Predicates=new ArrayList<Predicate>();

   Predicates.add(cb.equal(root.get("creator").get("uid"), 123456));
   query.where(Predicates.toArray(new Predicate[Predicates.size()]));
   return null;
}
Run Code Online (Sandbox Code Playgroud)

我只想创建像“select ... from job where user_id = 123456”这样的查询,但是spring执行像“select ... from job m cross join user u where m.creator = u.uid and u.uid = 123456” ”。

如何避免在 ManyToOne 链接中使用连接条件,只需选择自己的列即可。

小智 5

我认为你应该将获取类型设置为lazy : ( fetch = FetchType.LAZY),或者删除它,@OneToMany 默认情况下它是LAZY。

这样,hibernate(而不是 spring)将在您的作业表上执行简单的选择查询。但是如果你将其保持为 EAGER,hibenate 将始终使用 User 表上的 join 来获取其数据,另一方面,在 LAZY 模式下,仅当你这样做时才会触发获取 User 数据的查询job.getCreator(),但在这种情况下事务/session 应保持打开状态。

问候,