我正在尝试将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")
}
但是,实际代码有数千行这样的行。使用这种方法会很繁琐并且使代码不可读。
所以我想知道我是否可以检测先前为同一映射创建的别名,并将其重用于其他限制。
答案 0 :(得分: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));
}
}