Hibernate: как я могу повторно использовать псевдоним по тем же критериям?

Я пытаюсь преобразовать запросы 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));
 }

}
</patient>

Когда я запускаю этот код, я получил следующую ошибку:

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

}
</string></string></patient>

licensed under cc by-sa 3.0 with attribution.