簡體   English   中英

休眠:如何在相同條件下重復使用別名?

[英]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.

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