[英]Hibernate: How can I reuse an alias on the same criteria?
我正在嘗試將HQL查詢轉換為條件,並創建別名以對條件執行聯接,如下所示:
public List<Patient> getPatients(String ssn, String phone, String zipCode) {
Criteria c = getCurrentSession().createCriteria(Patient.class);
if(ssn != null) {
c.add(Restrictions.eq("ssn", ssn));
}
if(phone != null) {
c.createAlias("contact", "contactAlias1")
c.add(Restrictions.eq("contactAlias1.phone", phone));
}
if(zipCode != null) {
c.createAlias("contact", "contactAlias2")
c.add(Restrictions.eq("contactAlias2.zipCode", zipCode));
}
}
當我運行此代碼時,出現以下錯誤:
org.hibernate.QueryException: duplicate association path
當然,我總是可以如下添加另一個if
條件,並使用單個別名:
if(phone != null || zipCode != null) {
c.createAlias("contact", "contactAlias")
}
但是,實際的代碼有成千上萬行這樣的代碼。 使用這種方法將很繁瑣,並使代碼不可讀。
因此,我想知道是否可以為同一映射檢測到先前創建的別名,並將其重用於其他限制。
使用Set存儲已經定義的別名:
public List<Patient> getPatients(String ssn, String phone, String zipCode) {
Set<String> definedAliases = new HashSet<String>();
Criteria c = getCurrentSession().createCriteria(Patient.class);
if(ssn != null) {
c.add(Restrictions.eq("ssn", ssn));
}
if(phone != null) {
if (!definedAliases.contains("contact")) {
c.createAlias("contact", "contactAlias");
definedAliases.add("contact");
}
c.add(Restrictions.eq("contactAlias.phone", phone));
}
if(zipCode != null) {
if (!definedAliases.contains("contact")) {
c.createAlias("contact", "contactAlias");
definedAliases.add("contact");
}
c.add(Restrictions.eq("contactAlias.zipCode", zipCode));
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.