여러 가지 이유로 Criteria API를 사용하지 않고 부분적으로 동적 인 HQL 쿼리를 작성하려고합니다. HQL 표현식을 사용하여 where 제한을 단락시키는 쉬운 방법이 있는지 알고 싶었습니다.Criteria 대신 hql 표현식을 사용하는 동적 HQL 쿼리?
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)
고마워요, 이것은 제가 의심 스럽지만, 여분의 매개 변수를 피하기 위해 표현식을 사용하는 방법이 있기를 바라고 있습니다. – user842800
@ user842800 목록이 없습니다. Hibernate의 질의 처리기는리스트를 지원하기 위해 (즉, 요소 수를 세고 결과 SQL에서 적절한 수의 위치 매개 변수를 생성하기 위해) 뒤에서 어떤 마술을해야한다. 따라서
null
을 전달하는 것은 옵션이 아니다. – ChssPly76SQL 삽입 가능성은 어떨까요? – krzakov