gpt4 book ai didi

java - 使用 hql 表达式而不是条件的动态 HQL 查询?

转载 作者:搜寻专家 更新时间:2023-11-01 01:55:34 36 4
gpt4 key购买 nike

出于各种原因,我正在尝试编写一个部分动态的 HQL 查询,而不求助于 Criteria API。我想知道是否有一种简单的方法可以使用 HQL 表达式来短路 where 限制。例如,这是工作正常的原始查询:

SELECT customer 
FROM Customer as customer
INNER JOIN customer.profile as profile
WHERE profile.status IN :statusCodes
AND profile.orgId IN :orgIds

StatusCodes 是一个字符串列表,orgIds 是一个整数列表。但是,任何一个都是可选的,并且不应该限制是否传递 null 而不是集合。我试过这样做:

SELECT customer 
FROM Customer as customer
INNER JOIN customer.profile as profile
WHERE (:statusCodes IS NULL OR profile.status IN :statusCodes)
AND (:orgIds IS NULL OR profile.orgId IN :orgIds)

不幸的是,这没有奏效,但是否有任何其他方法可能奏效,无论是使用不同的表达式还是传递默认值?

编辑:需要说明的是,我正在寻找一种使用 NamedQuery 的方法,而不是以任何方式动态构建查询。

解决方案:我使用了额外的查询参数来完成它。我创建了两个辅助方法:

private void setRequiredParameter(TypedQuery<?> query, String name, Object value) {
query.setParameter(name, value);
}

private void setOptionalParameter(TypedQuery<?> query, String name, Object value) {
query.setParameter(name, value);
query.setParameter(name + "Optional", value == null ? 1 : 0);
}

查询如下:

SELECT customer 
FROM Customer as customer
INNER JOIN customer.profile as profile
WHERE (:statusCodesOptional = 1 OR profile.status IN :statusCodes)
AND (:orgIdsOptional = 1 OR profile.orgId IN :orgIds)

最佳答案

我的建议是将所有参数放在一个映射中并动态构建查询,在构建之后执行之前设置查询所需的所有参数从映射中获取值:

Map<String, Object> pars = new HashMap<String,Object>();
pars.put("statusCodes", statusCodes);
pars.put("orgIds", orgIds);

StringBuilder b = "SELECT customer FROM Customer as customer INNER JOIN customer.profile as profile where 1 = 1";
if (statusCodes != null) {
b.append(" and profile.status in :statusCodes");
}
if (orgIds != null) {
b.append(" and profile.orgId in :statusCodes");
}

...

Query q = session.createQuery(b.toString());

...

for (String p : q.getNamedParameters()) {
q.setParameter(p, pars.get(p));
}

当然需要进行一些改进,例如在未设置参数时抛出异常,如果复杂性大于几个简单参数则使用类型化参数等。

关于java - 使用 hql 表达式而不是条件的动态 HQL 查询?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10640736/

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