JP-QL에서 'ElementCollection'맵 필드에 대해 "멤버"쿼리를 실행하십시오 (JPA 2.0)

StackOverflow https://stackoverflow.com/questions/1548124

문제

연관 배열에 대한 "쿼리"쿼리를 실행할 수 있습니까? 그렇다면 구문은 어떻게 생겼습니까? 명백한 해결 방법은 기본 쿼리이지만 모든 조인 등이 무엇인지 지저분 해집니다. 지도의 키 세트, 값 수집 또는 항목 세트 내에 객체의 존재를 테스트하고 싶습니다. 아마도 다음과 같은 것일 수 있습니다.

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