家长班:
@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 users a LEFT JOIN genders b ON a.id = b.id WHERE b.sex =&#39; DASD&#39;
返回1 ROW 它运作良好。我只得到一条符合这种条件的记录。
但JPQL中的代码相同:
从一个用户中选择一个LEFT JOIN a.genders b WHERE b.sex =&#39; dasd&#39;
返回: 一个用户 - 正确和表性别中的所有性别,但我不想只有当性别=&#39; dasd&#39;并且只有一条符合这种条件的记录.btw JPQL生成N+1 issue并且每个子查询忽略条件性别=&#39; dasd&#39;
如何编写满足条件的子查询?我是否可以强制子查询仅返回与JPQL查询匹配的Gender?
答案 0 :(得分:3)
在JPQL中,您可以从实体而不是表中选择
SELECT a FROM User a LEFT JOIN a.genders b WHERE b.sex ='dasd'
由于您将a.genders列表配置为EAGER,因此每次选择User时,它都会获取用户所关联的所有性别。即使它们与JPQL查询不匹配。
如果您将a.genders列表设置为LAZY,则它不会获取任何Gender,因为您只从User中选择
该查询等同于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'