문제

사용시 명명 된 쿼리에서 옵션 매개 변수를 지정하는 방법 (예 : 양식에서 검색 매개 변수가 제공되고 모든 매개 변수가 필요하지 않은 경우)을 지정하는 방법이 있습니까? 최대 절전 모드? 나는 원주민을 사용하고 있습니다 SQL 쿼리이지만 질문은 아마도 이름이 지명 될 수 있습니다. HQL 쿼리.

나는 이것에 대한 답이 '아니오'라고 확신하지만, 아직 문서에서 결정적인 답변을 찾지 못했습니다.

도움이 되었습니까?

해결책

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
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top