JPQL无法正常工作

时间:2016-12-05 16:31:28

标签: mysql spring hibernate spring-data 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 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?

1 个答案:

答案 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'