gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 12:30:07 27 4
gpt4 key购买 nike

我正在尝试将 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));
}

}

关于java - Hibernate:如何在相同条件下重用别名?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25993631/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com