2016-12-05 65 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