Ejecutar “Miembro de” consulta contra campos Mapa 'ElementCollection' en JP-QL (JPA 2.0)

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

Pregunta

¿Es posible ejecutar un "miembro de" consulta en matrices asociativas? Si es así, ¿qué aspecto tiene la sintaxis como? La solución obvia es una consulta nativa, sino que se pone bastante desordenado con lo que todos los puntos de unión y tal. Me gustaría probar la existencia de un objeto dentro de tecla de memoria, recolección valor o entrada de conjunto del mapa. Tal vez algo como lo siguiente:

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

Código de Proveedor agnóstica podría ser demasiado pedir; admite este EclipseLink?

¿Fue útil?

Solución

JPQL tiene una función llamada index() que es útil para obtener el índice en una lista @OrderColumn. Y como usted mismo ha dicho, mapas también se denominan matrices asociativas y las teclas mapa corresponden a los índices de matriz. Por lo que nada impide index() de devolver la clave de una entrada de mapa.

Esta consulta funciona perfectamente en hibernación:

SELECT p FROM Person p, in (p.phoneNumbers) number 
WHERE number = '867-5309' AND index(number) = 'home'

Otros consejos

Se debe trabajar:

SELECT p FROM Person p 
WHERE (select count(*) from p.phoneNumbers where name='home' and value='867-5309') > 0

La siguiente consulta funciona para mí:

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

El (2) especificación JPA no define su sintaxis para un Mapa su uso en MIEMBRO (que se está refiriendo originalmente para arrays, pero no veo la relevancia si tiene un mapa) , en consecuencia, no se puede confiar en cualquier sintaxis siendo válida para todas las implementaciones de JPA. Desde JPQL no es compatible con los métodos de Java como el conjunto de claves, los valores entonces no puedo ver a los que están siendo probable. Lo más probable es que sólo apoyará la comprobación de la existencia de un valor, como

'867-5309' MEMBER OF p.phoneNumbers

A modo de referencia, en JDOQL, que haría

p.phoneNumbers.containsKey('home');
p.phoneNumbers.containsValue('867-5309');
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top