由于各种原因,我正在尝试编写部分动态的 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)