2016-12-05 198 views
0

父类:JPQL不能正常工作

@Table(name = "users") 
class User { 
@OneToMany(mappedBy = "user", cascade = CascadeType.ALL, fetch = FetchType.EAGER) 
List<Gender> genders = new ArrayList<>(); 

子类:

@Table(name = "gender") 
class Gender { 
@ManyToOne(cascade = {CascadeType.ALL}) 
@JoinColumn(name = "userId", nullable = false) 
User user; 
String sex; 

我的目标在MySQL:

SELECT * FROM用户LEFT JOIN性别b。在一.id = b.id WHERE b.sex ='dasd'

退货1 ROW 它的效果很好。我只有一条记录符合这个条件。

但相同的代码在JPQL:

选择一个来自用户的左连接a.genders B其中b.sex = 'DASD'

返回: 一个用户 - 正确和ALL性别,但我不想所有我只想当性=“dasd”,只有一个记录符合这种情况.btw JPQL生成N+1 issue和每个子查询忽略condtion性='dasd'

如何写子查询满足条件?我可以强制子查询仅返回与JPQL查询匹配的性别吗?

+0

您能否提供性别实体代码? –

+0

我也包括Gender.java(子女) – user3871754

回答

3

在JPQL从实体不表中选择,

SELECT a FROM User a LEFT JOIN a.genders b WHERE b.sex ='dasd' 

既然你配置的a.genders列表,跃跃欲试,每次选择一个用户时,它会获取用户asociated到所有性别。即使它们与JPQL查询不匹配。

如果你设置了a.genders列表懒,它不会因为你只从用户选择的取任何性别,

如果你只想选择一个查询等效于SQL

SELECT a.* FROM users a LEFT JOIN genders b ON a.id=b.id WHERE b.sex='dasd' 

一个性别

SELECT b FROM Gender b WHERE b.user = :user AND b.sex = 'dasd' 
+0

每次你选择一个用户,它将获取用户所有的性别。即使它们与JPQL查询不匹配。是的,这是问题。我可以强制它仅返回与JPQL查询匹配的性别吗? – user3871754

+0

问题是您没有选择性别,您正在选择一个用户。如果您使用EAGER,性别集合将通过完整集合进行初始化。如果你使用LAZY,那么性别集合将被一个代理初始化,如果需要的话(如果你做'a.getGenders()'),它将获取整个集合。我编辑了如何选择一个性别的答案。 – chalailama

+0

好的,我可以用标准来做吗?我不想做额外的查询 – user3871754