mysql - JPQL 无法正常工作

标签 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='dasd'

返回 1 行 它运作良好。我只有一条记录符合这个条件。

但 JPQL 中的代码相同:

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

返回: 一个用户 – 正确地和表性别中的所有性别,但我不想所有我只想要当 sex ='dasd' 并且只有一个满足此条件的记录。顺便说一句 JPQL 生成 N+1 issue并且对于忽略条件 sex ='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'

关于mysql - JPQL 无法正常工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40978885/

相关文章:

java - Hikari 连接不可用和意外的多池问题

java - Hibernate 在插入之前进行选择。这是预期的行为吗?如果是,目的是什么?

java - hibernate 中的 TypeMisMatchException

通过 PowerShell 连接 MySQL 数据库,旧式密码

php - div 中的 ajax 身份验证

mysql - SQL双数据库安全

php - 如何连接 SQL 查询以从数据库获取变量?

java - 避免 DAO 交叉访问

jquery - 使用 Ajax 的 PUT 请求(处理 Spring)

Spring JPA : The column name ** was not found in this ResultSet