2012-04-21 3 views
0

У меня есть три класса: доктор, пациент и консультации. В классах «Доктор» и «Пациент» есть список консультаций в качестве поля.Как написать запрос в 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; 
//... 
} 

Я хочу получить пациентов врача из одного запроса; это все пациенты, которые имеют ту же консультацию, что и врач. Обратите внимание, что между Доктором и Пациентом нет связи. Возможно ли это?

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> 

, но в этом случае будет 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

Я нашел работу вокруг; Я получаю все Консультации, а затем пациент от каждой консультации. Тем не менее, я хотел бы знать, возможно ли что-то вроде того, что делает abouve. – m3th0dman

ответ

2

Что-то вроде:

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

?

+0

Работает таким образом. Благодаря! – m3th0dman

0

Вы можете использовать аннотацию NamedQuery, который выглядит примерно как показано ниже

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

(просто проверить синтаксис только этого запроса)

Это даст один пациент для врача ид.

Поскольку ваша ассоциация подобна пациенту, у вас есть консультации, и каждая консуляция имеет один к одному сопоставление с пациентом и доктором. В настоящее время нет никакой связи в вашей модели сущности, чтобы получить всех пациентов для врача. Пациент к Доктору - это много-много отношений, и в настоящее время ваша организация, похоже, не поддерживает это. Я не думаю, что без отношения пациента к врачу вы можете получить записи в одном запросе.

Смежные вопросы