簡體   English   中英

JPQL無法正常工作

[英]JPQL does not work properly

家長班:

@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中的目標:

從用戶中選擇*從左加入性別b在a.id = b.id上b.sex ='dasd'

返回1 ROW,效果很好。 我只有一條符合這一條件的記錄。

但是JPQL中的相同代碼:

從用戶中選擇一個左聯接a。性別b在哪里b.sex ='dasd'

返回值:一個用戶–正確,並且表Gender中的所有性別均正確,但是我只希望當sex ='dasd'並且只有一個滿足此條件的記錄時才想要。btw JPQL生成N + 1問題,並且每個子查詢都忽略條件性別='dasd'

如何編寫滿足條件的子查詢? 我可以強制子查詢僅返回與JPQL查詢匹配的性別嗎?

在JPQL中,您從實體而非表格中選擇,

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

由於將a.genders列表配置為EAGER,因此每次選擇用戶時,它將獲取與該用戶關聯的所有性別。 即使它們與JPQL查詢不匹配。

如果您將a.genders列表設置為LAZY,則它將不會獲取任何性別,因為您僅從用戶中選擇了

該查詢相當於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'

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM