针对关系 table 的 Hibernate 查询
Hibernate query targetting a relation table
我正在使用 Hibernate 对 2 table 进行建模,通过关系 table 连接,内部变量如下:
// 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;
}
}
// 诊所医生
@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'
老实说,我不知道为什么这是错误的。我相信以前做过这个,但在某个地方有一些我看不到(或理解)的东西阻止了这个查询的工作。有人可以帮助我吗?
编辑:按照下面的建议,我试过这个:
Query query = session.createQuery("SELECT cd FROM ClinicDoctor cd WHERE cd.doctor.name = :docname");
query.setParameter("docname", X);
而且效果很好。但是,我更喜欢基于条件的答案,或者至少是关于为什么我的初始查询不起作用的解释。有什么想法吗?
我首先看到的是
where
clinic1_.name=?
你在问题中说:
I want to list all relations where the name of the doctor is 'X'.
所以您的查询试图检索 诊所 名称为 'X'
的关系
如果你想第一个试试这个:
Query query = session.createQuery("SELECT cd FROM ClinicDoctor cd WHERE cd.doctor.name = :docname");
query.setParameter("docname", X);
我正在使用 Hibernate 对 2 table 进行建模,通过关系 table 连接,内部变量如下:
// 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;
}
}
// 诊所医生
@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'
老实说,我不知道为什么这是错误的。我相信以前做过这个,但在某个地方有一些我看不到(或理解)的东西阻止了这个查询的工作。有人可以帮助我吗?
编辑:按照下面的建议,我试过这个:
Query query = session.createQuery("SELECT cd FROM ClinicDoctor cd WHERE cd.doctor.name = :docname");
query.setParameter("docname", X);
而且效果很好。但是,我更喜欢基于条件的答案,或者至少是关于为什么我的初始查询不起作用的解释。有什么想法吗?
我首先看到的是
where
clinic1_.name=?
你在问题中说:
I want to list all relations where the name of the doctor is 'X'.
所以您的查询试图检索 诊所 名称为 'X'
的关系如果你想第一个试试这个:
Query query = session.createQuery("SELECT cd FROM ClinicDoctor cd WHERE cd.doctor.name = :docname");
query.setParameter("docname", X);