【问题标题】:How to write query in JPQL?如何在 JPQL 中编写查询?
【发布时间】:2012-05-02 22:01:14
【问题描述】:

我有三个课程:医生、患者和咨询。 Doctor 和 Patient 类都有一个咨询列表作为字段。

@Entity
public class Consultation {
    @Id
    @GeneratedValue
    private int id;
    private Calendar scheduleDate;
    private String information;
    private String symptoms;
    @ManyToOne
    private Doctor doctor;
    @ManyToOne
    private Patient patient;
//...
}

@Entity
public class Patient {
    @Id
    @GeneratedValue
    private int id;
    private String name;
    private String ssn;
    private String address;
    @OneToMany(mappedBy = "patient")
    private List<Consultation> consultations;
//...
}

@Entity
public class Doctor  {
    @Id
    @GeneratedValue
    private int id;
    private String name;
    private String specialization;
    @OneToMany(mappedBy = "doctor")
    private List<Consultation> consultations;
//...
}

我想从单个查询中获取某位医生的患者;那是所有与医生进行相同咨询的患者。请注意,医生和患者之间没有任何联系。 这可能吗?

select p from Patient p where p.consultations **someKeyword** (select d.consultations from Doctor d where d.id = :doctorId)

如果我没记错的话 someKeyword 会是 contains 如果有的话

where list<entity> contains entity

如果

where entity in list<entity>

但在这种情况下会有

list someKeyword list

组合是:

select p from Patient p where p.consultations contains (select c from Consultation c where c in (select d.consultations from Doctor d where d.id = :doctorId))

但这有意义吗?

我是 JPA 和 JPQL 的初学者。

【问题讨论】:

  • 我找到了解决办法;我得到了所有的咨询,然后是每次咨询的病人。不过,我想知道上面的内容是否有意义/是否可行。

标签: java database jpa jpql


【解决方案1】:

类似:

select p from Patient p
where exists (
    select c from Consultation c
    where c.patient = p
    and c.doctor.id = :doctorId
)

?

【讨论】:

    【解决方案2】:

    本教程可能会有所帮助: JPA Tutorial

    【讨论】:

      【解决方案3】:

      您可以使用如下所示的 NamedQuery 注释

      @NamedQuery(
         name = "findPatientForDoctor", 
         query = "SELECT c.patient FROM Consultation c WHERE c.doctor.id : id"))
      

      (只检查这个查询的语法)

      这将为一名患者提供医生 ID。

      由于您的关联就像 Patient 进行咨询,并且每次咨询都与 Patient 和 Doctor 进行一对一的映射。目前,您的实体模型中没有任何关系可以为医生获取所有患者。患者与医生是多对多关系,目前您的实体似乎不支持这一点。我认为如果没有患者与医生的关系,您无法在一次查询中获取记录。

      【讨论】:

        猜你喜欢
        • 2011-02-20
        • 2013-01-17
        • 1970-01-01
        • 2021-05-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-01-14
        • 2019-07-01
        相关资源
        最近更新 更多