【问题标题】:How to write jpql query for subquery with multiple conditions and other relationships如何为具有多个条件和其他关系的子查询编写 jpql 查询
【发布时间】:2016-08-09 02:14:06
【问题描述】:

我想通过 JPQL 触发以下查询。我是 JPA 的新手,正在学习 JPQL,但卡在了这个查询中。

SELECT * FROM users
WHERE userid NOT IN (SELECT userid FROM applicants)
AND gender = 'MALE' AND (firstname like '%R%' OR lastname like '%S%');

这里的性别和姓名参数是动态传递的,但这里我保持静态。

我的课程片段是: 这是我的用户类
用户类:

@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 类与 User 类有 OneToOne 关系,join 列是 userid。

申请人类别:

@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;
}

【问题讨论】:

    标签: postgresql jpa hql jpql


    【解决方案1】:

    您想通过 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%');
    

    如果是,您可能应该从那里找到答案。

    【讨论】:

    • 是的,我应该以这种方式使用查询而不是x
    • 您好 Ridham,如果您对该答案感到满意,请将其标记为最佳,以便社区知道此问题已得到处理。谢谢你:)
    • 现在这很可悲,但我很确定你会这样做,你只需要 1:stackoverflow.com/help/privileges/create-posts“标记为已接受的答案”:D
    【解决方案2】:

    该 SQL 的 JPQL 查询

    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();
    

    【讨论】:

    • 感谢伙伴工作完全正常。我对别名感到困惑
    猜你喜欢
    • 2021-10-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-23
    • 1970-01-01
    • 2019-07-01
    • 1970-01-01
    相关资源
    最近更新 更多