簡體   English   中英

如何使用Hibernate HQL或Criteria內部連接兩個表?

[英]How to inner join two tables using Hibernate HQL or Criteria?

@Entity
public class doctor {
   @Id
   private int id;
   private String username;
   private String password;
   private String phone;
   private String email;

   @OneToMany(targetEntity = patient.class, cascade = CascadeType.ALL, mappedBy = "doctor")
   @Cascade(value = org.hibernate.annotations.CascadeType.ALL)
   private Collection<patient> patients = new ArrayList<patient>();
}

@Entity
public class patient {
   @Id
   private int id;
   private String name;
   private String surname;
   private String phone;
   private int systolic;
   private int diastolic;

   @ManyToOne
   private doctor doctor;
}

目前我只能通過以下標准檢索醫生信息:

Criteria query = session.createCriteria(doctor.class);
query.createCriteria("patients", "p");
query.add(Restrictions.eq("p.phone", phone));
List<doctor> doctorList = (ArrayList<doctor>) query.list();

如何通過提供患者電話,醫生信息和一些患者信息來恢復休眠標准?

類似於:phone = 3423423424,然后是answear:

-------------醫生的信息---------------------------------- patientinfo (收縮壓,舒張壓)-----------------------

  1 "Dr dre" sdfssd 243242 drdre@gmail.com  160 170

其中160 170是患者的信息

如果沒有標准,使用HQL?

你想要的是以下內容。

使用Hibernate Criteria API:

Criteria query = sessionFactory.getCurrentSession().
createCriteria(Patient.class, "patient");
query.setProjection(Projections.projectionList().
add(Projections.property("patient.doctor")).
add(Projections.property("patient.systolic")).
add(Projections.property("patient.diastolic")));
query.add(Restrictions.eq("patient.phone", phone));
return query.list();

使用HQL(實際上只是JPQL):

select p.doctor, p.systolic, p.diastolic from Patient p where p.phone = ?1

您在結果中得到的是Type List<Object[]> 同時將@Cascade(value=CascadeType.SAVE_UPDATE)添加到Patient類的doctor字段中。

您的查詢僅返回醫生信息(而不是患者的信息)的原因是因為對於OneToMany關系,默認情況下FetchType設置為LAZY ,如果指定獲取類型為EAGER,則hibernate也將返回患者。

@OneToMany(targetEntity = patient.class, cascade = CascadeType.ALL, mappedBy = "doctor", fetch = FetchType.EAGER)

您有雙向映射,因此每位醫生都可以得到患者,每位患者都可以獲得醫生信息。 如果您需要患者列表而不是醫生列表,只需為患者創建類似的標准。 session.createCriteria(patient.class) ,具有所需的限制。 你不必急於求成。 在大多數情況下,我們不需要急切的提取。 如果你需要hibernate會話之外的對象,那么初始化(Hibernate.initialize)集合或代理要好得多。

btw在命名java類時使用camel case。 它是廣泛使用的慣例。

如果您使用的是HibernateTemplate

String hql = "from Boo where id in (:listParam)";
String[] params = { "listParam" };
Object[] values = { list};
List boos = getHibernateTemplate().findByNamedParam(hql, params, values);

引自春季論壇

暫無
暫無

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

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