2016-07-20 5 views
1

Я использую Hibernate для моделирования 2 таблиц, соединенных с помощью таблицы с соотношением внутренними переменными, как это:Hibernate запрос ориентируется таблица отношения

// Clinic.java

@Entity 
@Table(name = "clinic") 
public class Clinic 
{ 
    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    @Column(name = "id") 
    private long id; 

    @Column(name = "name") 
    private String name; 

    @OneToMany(fetch = FetchType.LAZY, mappedBy = "pk.clinic", cascade = CascadeType.ALL) 
    private Set<ClinicDoctor> clinicDoctors = new HashSet<ClinicDoctor>(0); 

    public long getId() 
    { 
     return id; 
    } 

    public void setId(long id) 
    { 
     this.id = id; 
    } 

    public String getName() 
    { 
     return name; 
    } 

    public void setName(String name) 
    { 
     this.name = name; 
    } 

    @JsonIgnore 
    public Set<ClinicDoctor> getClinicDoctors() 
    { 
     return clinicDoctors; 
    } 

    public void setClinicDoctors(Set<ClinicDoctor> clinicDoctors) 
    { 
     this.clinicDoctors = clinicDoctors; 
    } 
} 

// Doctor.java

@Entity 
@Table(name = "doctor") 
public class Doctor 
{ 
    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    @Column(name = "id") 
    private long id; 

    @Column(name = "name", nullable = false) 
    private String name; 

    @OneToMany(fetch = FetchType.LAZY, mappedBy = "pk.doctor", cascade = CascadeType.ALL) 
    private Set<ClinicDoctor> clinicDoctors = new HashSet<ClinicDoctor>(0); 

    public long getId() 
    { 
     return id; 
    } 

    public void setId(long id) 
    { 
     this.id = id; 
    } 

    public String getName() 
    { 
     return name; 
    } 

    public void setName(String name) 
    { 
     this.name = name; 
    } 

    @JsonIgnore 
    public Set<ClinicDoctor> getClinicDoctors() 
    { 
     return clinicDoctors; 
    } 

    public void setClinicDoctors(Set<ClinicDoctor> clinicDoctors) 
    { 
     this.clinicDoctors = clinicDoctors; 
    } 
} 

// ClinicDoctor

@Entity 
@Table(name = "clinic_doctor") 
@AssociationOverrides({ @AssociationOverride(name = "pk.clinic", joinColumns = @JoinColumn(name = "clinic")), 
     @AssociationOverride(name = "pk.doctor", joinColumns = @JoinColumn(name = "doctor")) }) 
public class ClinicDoctor 
{ 
    @EmbeddedId 
    private ClinicDoctorId pk = new ClinicDoctorId(); 

    @Column(name = "attendingHours") 
    private String attendingHours; 

    public ClinicDoctorId getPk() 
    { 
     return pk; 
    } 

    public void setPk(ClinicDoctorId pk) 
    { 
     this.pk = pk; 
    } 

    public String getAttendingHours() 
    { 
     return attendingHours; 
    } 

    public void setAttendingHours(String attendingHours) 
    { 
     this.attendingHours = attendingHours; 
    } 

    // Equals & HashCode 
} 

// ClinicDoctorId

public class ClinicDoctorId implements Serializable 
{ 
    private static final long serialVersionUID = 5880105185191860784L; 

    @ManyToOne 
    private Clinic clinic; 

    @ManyToOne 
    private Doctor doctor; 

    public Clinic getClinic() 
    { 
     return clinic; 
    } 

    public void setClinic(Clinic clinic) 
    { 
     this.clinic = clinic; 
    } 

    public Doctor getDoctor() 
    { 
     return doctor; 
    } 

    public void setDoctor(Doctor doctor) 
    { 
     this.doctor = doctor; 
    } 

    // Equals & HashCode 
} 

Я хочу, чтобы перечислить все отношения, где название клиники «X». Моя лучшая попытка до сих пор это:

Criteria criteria = session.createCriteria(ClinicDoctor.class); 
criteria.createAlias("pk.clinic", "clinic").add(Restrictions.eq("clinic.name", "X")); 
res = new ArrayList<>(criteria.list()); 

Это, однако, приводит следующий запрос Hibernate и ошибок:

Hibernate: 
    select 
     this_.clinic as clinic2_1_0_, 
     this_.doctor as doctor3_1_0_, 
     this_.attendingHours as attendin1_1_0_ 
    from 
     clinic_doctor this_ 
    where 
     clinic1_.name=? 

ERROR: Unknown column 'clinic1_.name' in 'where clause' 

Я честно не знаю, почему это не так. Я считаю, что сделал это раньше, но где-то есть что-то, чего я просто не вижу (или понимаю), который мешает этому запросу работать. Может кто-нибудь дать мне руку с этим?

EDIT: Как было предложено ниже, я попытался это:

Query query = session.createQuery("SELECT cd FROM ClinicDoctor cd WHERE cd.doctor.name = :docname"); 
query.setParameter("docname", X); 

и она прекрасно работает. Однако я бы предпочел ответ на основе критериев или, по крайней мере, объяснение, почему мой первоначальный запрос не работает. Есть идеи?

ответ

0

первая вещь, которую я вижу

where 
     clinic1_.name=? 

в то время как вы сказали, в вашем вопросе:

I want to list all relations where the name of the doctor is 'X'.

поэтому ваш запрос пытается feching отношения, где название клиники является «X»

если хотите первый попробуйте это:

Query query = session.createQuery("SELECT cd FROM ClinicDoctor cd WHERE cd.doctor.name = :docname"); 
query.setParameter("docname", X); 
+0

Спасибо за ответ. Вы правы: я имел в виду «все отношения, в которых название клиники« X ». Я отредактировал свой вопрос. Тем не менее, я пробовал ваше предложение и появляется новая ошибка: org.hibernate.QueryException: не удалось разрешить свойство: doctor of: com.example.objects.ClinicDoctor [SELECT cd FROM com.example.objects.ClinicDoctor cd WHERE cd .doctor.name =: docname] – Arreis

+0

ОК, я попытался изменить «cd.doctor.name» для «cd.pk.doctor.name», и теперь он отлично работает. Мне кажется, что это правильный ответ, но я бы предпочел решение, основанное на критериях. Если ничего не появится, я помечаю этот ответ как правильный. – Arreis

+0

попробуйте другое имя псевдонима: criteria.createAlias ​​("pk.clinic", "c"). Add (Restrictions.eq ("c.name", "X")); –

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

  • Нет связанных вопросов^_^