さまざまな理由から、Criteria API に頼らずに部分的に動的な HQL クエリを作成しようとしています。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を使用する方法を探しています。
解決策: 追加のクエリ パラメータを使用してそれを実現しました。2 つのヘルパー メソッドを作成しました。
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)