Reputation: 6160
I want to fire following query through JPQL.I am new to JPA and learning JPQL but stuck at this query.
SELECT * FROM users
WHERE userid NOT IN (SELECT userid FROM applicants)
AND gender = 'MALE' AND (firstname like '%R%' OR lastname like '%S%');
Here gender and name parameters are passed dynamically but here i kept it static.
My Classes Snippets are:
This is my user class
User 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;
}
Applicant class has OneToOne relationship with User class and join column is userid.
Applicant 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;
}
Upvotes: 1
Views: 1653
Reputation: 1
JPQL query for that SQL
SELECT * FROM users
WHERE userid NOT IN (SELECT userid FROM applicants)
AND gender = 'MALE' AND (firstname like '%R%' OR lastname like '%S%');
will be the next:
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();
Upvotes: 0
Reputation: 1864
Isn't what you want to achieve achievable with a 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%');
Or a NOT IN:
SELECT * FROM users
WHERE userid NOT IN (SELECT userid FROM applicants)
AND gender = 'MALE' AND (firstname like '%R%' OR lastname like '%S%');
If yes, you should probably find your answer starting from there.
Upvotes: 2