提问者:小点点

如何避免Spring Data 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;
}

我只想创建像"select… from job whereuser_id=123456"这样的查询,但是Spring执行像"select…from job m交叉加入用户u where m.creator=u.uid and u.uid=123456"这样的查询。

如何避免在ManyToOne链接中加入使用标准,只需在自己的列中选择即可。


共2个答案

匿名用户

我认为你应该将fetch type设置为懒:(fetch=FetchType. LAZY),或者删除它,默认情况下@OneTo多是LAZY。

这样hibernate(不是Spring),将对您的Job表进行简单的选择查询。但是如果您将其保留为EAGER,hibenate将始终在User表上使用join来获取它的数据,另一方面,在LAZY模式下,只有当您执行job. getCreator()时才会触发获取User数据的查询,但在这种情况下,事务/会话应该保持打开状态。

祝好

匿名用户

创建查询。即。

@Query(value = "SELECT * FROM JOB WHERE USER_ID = ?1", nativeQuery = true)
Job getByUserId(Integer userId);

来源