Hibernate:如何在相同的条件下重用别名?

时间:2014-09-23 11:13:31

标签: java hibernate alias hibernate-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")
}

但是,实际代码有数千行这样的行。使用这种方法会很繁琐并且使代码不可读。

所以我想知道我是否可以检测先前为同一映射创建的别名,并将其重用于其他限制。

1 个答案:

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

}