[英]How to join two tables with a group query using Hibernate (5.4) 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.