多条件等关系的子查询如何写jpql查询
How to write jpql query for subquery with multiple conditions and other relationships
我想通过 JPQL.I 触发以下查询,我是 JPA 的新手,正在学习 JPQL,但遇到了这个查询。
SELECT * FROM users
WHERE userid NOT IN (SELECT userid FROM applicants)
AND gender = 'MALE' AND (firstname like '%R%' OR lastname like '%S%');
这里性别和名字参数是动态传递的,这里我保持静态。
我的 Classes 片段是:
这是我的用户 class
用户Class:
@Table(name = "users")
public class User{
@Id
@GeneratedValue
private long userId;
@Column(unique = true, nullable = false)
private String email;
private String firstName;
private String middleName;
private String lastName;
private String gender;
private Timestamp appliedOn;
}
申请人 class 与用户 class 具有一对一关系并且连接列是用户 ID。
申请人Class:
@Entity
@Table(name = "applicants")
public class Applicant{
@Id
private long applicantId;
@OneToOne
@JoinColumn(name = "userId")
private User user;
@ManyToOne
@JoinColumn(name = "subCourseId")
private SubCourse course;
@ManyToOne
@JoinColumn(name = "collegeId")
private College college;
}
你想通过 LEFT JOIN 实现的目标是不是可以实现:
SELECT * FROM users
LEFT JOIN applicants ON users.userid = applicants.userid
WHERE applicants.userid IS NULL
AND gender = 'MALE' AND (firstname like '%R%' OR lastname like '%S%');
或不在:
SELECT * FROM users
WHERE userid NOT IN (SELECT userid FROM applicants)
AND gender = 'MALE' AND (firstname like '%R%' OR lastname like '%S%');
如果是,您可能应该从那里开始找到答案。
JPQL 查询 SQL
SELECT * FROM users
WHERE userid NOT IN (SELECT userid FROM applicants)
AND gender = 'MALE' AND (firstname like '%R%' OR lastname like '%S%');
下一个:
String jpql = "SELECT us FROM User us WHERE us.userId NOT IN (SELECT appl.user.userId FROM Applicant appl) AND us.gender = ?1 AND (us.firstName LIKE ?2 OR us.lastName LIKE ?3)";
Query query = entityManager.createQuery(jqpl);
query.setParameter(1, "MALE");
query.setParameter(2, "%R%");
query.setParameter(3, "%S%");
query.getResultList();
我想通过 JPQL.I 触发以下查询,我是 JPA 的新手,正在学习 JPQL,但遇到了这个查询。
SELECT * FROM users
WHERE userid NOT IN (SELECT userid FROM applicants)
AND gender = 'MALE' AND (firstname like '%R%' OR lastname like '%S%');
这里性别和名字参数是动态传递的,这里我保持静态。
我的 Classes 片段是:
这是我的用户 class
用户Class:
@Table(name = "users")
public class User{
@Id
@GeneratedValue
private long userId;
@Column(unique = true, nullable = false)
private String email;
private String firstName;
private String middleName;
private String lastName;
private String gender;
private Timestamp appliedOn;
}
申请人 class 与用户 class 具有一对一关系并且连接列是用户 ID。
申请人Class:
@Entity
@Table(name = "applicants")
public class Applicant{
@Id
private long applicantId;
@OneToOne
@JoinColumn(name = "userId")
private User user;
@ManyToOne
@JoinColumn(name = "subCourseId")
private SubCourse course;
@ManyToOne
@JoinColumn(name = "collegeId")
private College college;
}
你想通过 LEFT JOIN 实现的目标是不是可以实现:
SELECT * FROM users
LEFT JOIN applicants ON users.userid = applicants.userid
WHERE applicants.userid IS NULL
AND gender = 'MALE' AND (firstname like '%R%' OR lastname like '%S%');
或不在:
SELECT * FROM users
WHERE userid NOT IN (SELECT userid FROM applicants)
AND gender = 'MALE' AND (firstname like '%R%' OR lastname like '%S%');
如果是,您可能应该从那里开始找到答案。
JPQL 查询 SQL
SELECT * FROM users
WHERE userid NOT IN (SELECT userid FROM applicants)
AND gender = 'MALE' AND (firstname like '%R%' OR lastname like '%S%');
下一个:
String jpql = "SELECT us FROM User us WHERE us.userId NOT IN (SELECT appl.user.userId FROM Applicant appl) AND us.gender = ?1 AND (us.firstName LIKE ?2 OR us.lastName LIKE ?3)";
Query query = entityManager.createQuery(jqpl);
query.setParameter(1, "MALE");
query.setParameter(2, "%R%");
query.setParameter(3, "%S%");
query.getResultList();