0

医師、患者、相談の 3 つのクラスがあります。医師と患者の両方のクラスには、フィールドとして相談のリストがあります。

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

単一のクエリから医師の患者を取得したいと考えています。つまり、医師と同じ診察を受けるすべての患者です。Doctor と Patient の間にはつながりがないことに注意してください。これは可能ですか?

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

私が間違っていなければ、 someKeyword含まれている場合

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の初心者です。

4

3 に答える 3

2

何かのようなもの:

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

?

于 2012-04-21T17:58:31.887 に答える
1

このチュートリアルが役立つかもしれません: JPA チュートリアル

于 2012-04-21T17:23:57.833 に答える
0

以下のような NamedQuery アノテーションを使用できます

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

(このクエリだけの構文を確認してください)

これにより、1 人の患者に医師 ID が与えられます。

あなたのアソシエーションは患者が相談するようなものであり、各相談には患者と医師との 1 対 1 のマッピングがあります。現在、エンティティ モデルには、医師のすべての患者を取得するための関係はありません。患者と医師は多対多の関係であり、現在、あなたのエンティティはそれをサポートしていないようです。患者と医師の関係がなければ、単一のクエリでレコードを取得できるとは思いません。

于 2012-04-21T19:39:39.237 に答える