簡體   English   中英

面向關系表的Hibernate查詢

[英]Hibernate query targetting a relation table

我正在使用Hibernate建模2個表,這些表由具有內部變量的關系表連接,如下所示:

// 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'

老實說,我不知道為什么這是錯誤的。 我相信以前已經做過,但是在某些地方我只是看不見(或理解)而無法執行此查詢。 有人可以幫我這個忙嗎?

編輯:如下所示,我嘗試了此操作:

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

而且效果很好。 但是,我希望基於標准的答案,或者至少對為什么我的初始查詢不起作用的解釋。 有任何想法嗎?

我首先看到的是

where
        clinic1_.name=?

當您在問題中說:

我想列出醫生名字為“ X”的所有關系。

因此您的查詢正在嘗試查找診所名稱為“ X”的關系

如果您希望第一個嘗試一下:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM