JP-QL에서 'ElementCollection'맵 필드에 대해 "멤버"쿼리를 실행하십시오 (JPA 2.0)
-
20-09-2019 - |
문제
연관 배열에 대한 "쿼리"쿼리를 실행할 수 있습니까? 그렇다면 구문은 어떻게 생겼습니까? 명백한 해결 방법은 기본 쿼리이지만 모든 조인 등이 무엇인지 지저분 해집니다. 지도의 키 세트, 값 수집 또는 항목 세트 내에 객체의 존재를 테스트하고 싶습니다. 아마도 다음과 같은 것일 수 있습니다.
SELECT p FROM Person p WHERE 'home' MEMBER OF p.phoneNumbers.keySet
SELECT p FROM Person p WHERE '867-5309' MEMBER OF p.phoneNumbers.values
SELECT p FROM Person p WHERE {'home' -> '867-5309'} MEMBER OF p.phoneNumbers
공급자-공급 코드는 요청하기에는 너무 많을 수 있습니다. eclipselink가 이것을 지원합니까?
해결책
JPQL에는 이름이 지정된 함수가 있습니다 index()
이는 인덱스를 얻는 데 유용합니다 @OrderColumn
목록. 그리고 자신이 말했듯이,지도는 연관 배열이라고도하며 맵 키는 배열 지수에 해당합니다. 따라서 아무것도 막을 수 없습니다 index()
지도 항목의 키를 반환하는 것입니다.
이 쿼리는 최대 절전 모드에서 완벽하게 작동합니다.
SELECT p FROM Person p, in (p.phoneNumbers) number
WHERE number = '867-5309' AND index(number) = 'home'
다른 팁
작동해야합니다.
SELECT p FROM Person p
WHERE (select count(*) from p.phoneNumbers where name='home' and value='867-5309') > 0
다음 쿼리는 나에게 작동합니다.
select model from AnsOutboxMsg model
left join fetch model.updateEntity upde
left join fetch upde.update upd
left join fetch model.ansMessage msg
left join fetch msg.template msgt
left join fetch msg.ansAction act
left join fetch act.ansRule rl
left join fetch rl.app app
where (select count(*) from model.contextMap where name = 'fltClient' and value = 'XXX') > 0 and model.status = 'sent' and app.id = 'SPN_TICKETS' and msgt.name = 'Client' order by model.modifDate DESC, model.id ASC
JPA (2) 사양은의 구문을 정의하지 않습니다. 지도 (원래 배열을 참조했지만 맵이있는 경우 관련성이 보이지 않음)의 구성원에서 사용하므로 모든 JPA 구현에 유효한 구문에 의존 할 수는 없습니다. JPQL은 Keyset과 같은 Java 메소드를 지원하지 않기 때문에 값을 볼 수 없습니다. 아마도 그것은 아마도 가치 존재에 대한 수표 만 지원할 것입니다.
'867-5309' MEMBER OF p.phoneNumbers
참고로 JDOQL에서는 할 수 있습니다
p.phoneNumbers.containsKey('home');
p.phoneNumbers.containsValue('867-5309');
제휴하지 않습니다 StackOverflow