2012-04-21 8 views
0

私は3つのクラスを持っています:医者、患者と相談。 DoctorクラスとPatientクラスの両方にフィー​​ルドとしての相談のリストがあります。JPQLでクエリを書くには?

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

私は、単一のクエリから医者の患者を取得したいと思います。それは医者と同じ相談を受けているすべての患者です。医者と患者の間には接続がないことに注意してください。 これは可能ですか?

where entity in list<entity> 

場合で

where list<entity> contains entity 

が存在することになるが、この場合にはそこになる場合

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

私が間違ってsomeKeywordじゃない場合だろうがが含まれていますbe

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

が、これはSENSを作るのですか?

私はJPAとJPQLの初心者です。

+0

私は回避策を見つけました。私はすべての相談を受けてから、各相談から患者を得ます。それでも、私は何が覚えているかのような何かが感知できるかどうかを知りたいと思います。 – m3th0dman

答えて

2

何か?

+0

このように動作します。ありがとう! – m3th0dman

1

このチュートリアルでは、役立つかもしれない:

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

:よう JPA Tutorial

0

あなたは、これはドクターidの一人の患者を与える

(ただこれだけでクエリの構文をチェックする)

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

以下のようになりますNamedQueryアノテーションを使用することができます。

あなたの協会は患者のようなものなので、協議があり、各協議は患者と医師との1対1のマッピングを持っています。現在、あなたのエンティティモデルには、すべての患者を医者にするという関係はありません。 Patient to Doctorは多対多の関係であり、現在あなたの主体はそれを支持していないようです。私は医者の関係に患者がなければ、あなたは1つのクエリでレコードを得ることができるとは思わない。