繁体   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