2014-09-23 57 views
0

我想HQL查詢轉換爲標準和創建別名來執行加入一個標準如下:Hibernate:如何在相同的條件下重用別名?

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") 
} 

但是,實際的代碼有上千像這樣的線條。使用這種方法將是乏味的,並使代碼不可讀。

因此,我想知道是否可以檢測到先前爲相同映射創建的別名並將其用於其他限制。

回答

1

使用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)); 
    } 

} 
相關問題