【发布时间】:2018-03-28 16:21:44
【问题描述】:
我有 @ManyToOne 链接的实体,当我使用条件执行查询时,弹簧使用交叉连接,但我只想在自己的列上进行选择。
案例:
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 where user_id = 123456”这样的查询, 但是 spring 执行类似于“select ... from job m cross join user u where m.creator = u.uid and u.uid = 123456”。
如何避免在多对一链接中加入使用条件,只需在自己的列上选择即可。
【问题讨论】:
-
"Spring" 不使用任何东西。您选择的 JPA 提供程序可以。为什么不告诉人们是哪一个,以及生成的 SQL(以及 JPQL)……都在 JPA 提供者的 LOG 中。 Spring 不是 JPA 提供者。还要发布生成查询的其余 JPA 标准代码。
User字段不是@OneToMany... 只有 Collection/Map 可以这样!!!阅读一些基本的 JPA 文档