최대 절전 모드에서 쿼리 명명 된 선택적 매개 변수?
-
20-09-2019 - |
해결책
Afaik, 그런 것은 없으므로이를 위해 동적 쿼리를 작성해야합니다. 어쩌면 이것을 살펴보십시오 이전 답변 HQL 에서이 작업을 수행하는 방법을 보여주고 (SQL로 전환 할 수 있음) 기준 API가 어떻게 더 간단하고, 따라서 내 의견으로는이 작업에 더 적합한지를 보여줍니다.
업데이트: 레거시 데이터베이스로 작업하는 것은 실제로 최대 절전 모드에서 까다로울 수 있습니다. 어쩌면 동적 기본 쿼리를 사용하고 반환 할 수 있습니다. 비 관리 엔티티 그렇지만. 그러나 장기적으로는 상황이 악화 될 수 있습니다 (나는 당신을 위해 그것을 말할 수 없습니다). 아마도 최대 절전 모드는 귀하의 경우 최선의 선택이 아니며 Ibatis와 같은 것이 필요한 유연성을 줄 것입니다.
다른 팁
a에서 언급했듯이 다른 대답 ~로 의문 앞서 언급 한 다음 HQL Construct는 다음과 같습니다.
select o from Product o WHERE :value is null or o.category = :value
만약에 :value
AS에 전달됩니다 null
, 모든 제품이 반환됩니다.
또한보십시오 선택적 또는 널 매개 변수
이것은 이 버그, 다음은 대안입니다.
select o from Product o WHERE isnull(:value, 1) = 1 or o.category = :value
불행히도 "옵션 또는 널 매개 변수"에 따른 솔루션은 목록에서 작동하지 않습니다. 다음과 같이 쿼리를 변경해야했습니다 ...
명명 된 쿼리 정의 :
select ls from KiCOHeader co
...
join lu.handlingType ht
where (:inHandlingTypesX = 1 OR ht.name in (:inHandlingTypes))
암호:
Set<KiHandlingTypeEnum> inHandlingTypes = ...
Query query = persistence.getEm().createNamedQuery("NAMED_QUERY");
query.setParameter("inHandlingTypesX", (inHandlingTypes == null) ? 1 : 0);
query.setParameter("inHandlingTypes", inHandlingTypes);
List<KiLogicalStock> stocks = query.getResultList();
훨씬 재미있는 일.
선택적 목록 매개 변수를 처리하기위한 또 다른 솔루션은 Coalesce 기능. Coalesce입니다 최대 절전 모드에 의해 지원됩니다 목록에서 첫 번째 비 널 매개 변수를 반환하여 목록에 여러 항목이있을 때 구문을 끊지 않고 목록에서 NULL을 확인할 수 있습니다.
옵션 매개 변수 및 목록 매개 변수가있는 HQL 예 :
select obj from MyEntity obj
where ( COALESCE( null, :listParameter ) is null or obj.field1 in (:listParameter) )
and ( :parameter is null or obj.field2 = :parameter )
이것은 SQL Server 방언으로 저에게 효과가있었습니다.
널 값에 문제가있는 사람들의 경우 또 다른 옵션은 대체 값을 사용하는 것입니다. 제 경우에는 카테고리 필드에 양수 값 만 사용하여 대체 값 = -1로 사용할 수 있습니다.
따라서 쿼리를 실행하기 전에 작은 검증을 할 수 있습니다.
if(value==null) {
value = -1;
}
....
....
select p from Product p WHERE :value = -1 or p.category = :value