views:

698

answers:

1

Is it possible to run a "MEMBER OF" query against associative arrays? If so, what does the syntax look like? The obvious workaround is a native query but that gets pretty messy what with all the joins and such. I'd like to test for existence of an object within the map's key set, value collection or entry set. Maybe something like the following:

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

Provider-agnostic code might be too much to ask for; does Eclipselink support this?

A: 

The JPA(2) spec doesn't define its syntax for a Map use in MEMBER OF (you were referring originally to arrays but I don't see the relevance if you have a map), consequently you can't rely on any syntax being valid for all JPA implementations. Since JPQL doesn't support Java methods like keySet, values then I can't see those being likely. More than likely it will only support the check for a value existence, like

'867-5309' MEMBER OF p.phoneNumbers

For reference, in JDOQL, you would do

p.phoneNumbers.containsKey('home');
p.phoneNumbers.containsValue('867-5309');
DataNucleus