Java 执行;成员;查询';元素集合';JP-QL(JPA2.0)中的映射字段

Java 执行;成员;查询';元素集合';JP-QL(JPA2.0)中的映射字段,java,orm,jpa,eclipselink,jpql,Java,Orm,Jpa,Eclipselink,Jpql,是否可以对关联数组运行“成员”查询?如果是,语法是什么样子的?显而易见的解决方法是本机查询,但由于所有连接等原因,这会变得非常混乱。我想测试映射的键集、值集合或条目集中是否存在对象。可能是以下情况: 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 F

是否可以对关联数组运行“成员”查询?如果是,语法是什么样子的?显而易见的解决方法是本机查询,但由于所有连接等原因,这会变得非常混乱。我想测试映射的键集、值集合或条目集中是否存在对象。可能是以下情况:

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支持这一点吗?

JPA(2)规范没有为成员中使用的映射定义其语法(您最初指的是数组,但如果您有映射,我看不出相关性),因此您不能依赖任何语法对所有JPA实现都有效。由于JPQL不支持像keySet、values这样的Java方法,所以我看不出这些方法是可能的。它很可能只支持检查值是否存在,如

'867-5309' MEMBER OF p.phoneNumbers
作为参考,在JDOQL中,您可以

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

JPQL有一个名为
index()
的函数,用于在
@OrderColumn
列表中获取索引。正如您自己所说,贴图也称为关联数组,贴图键对应于数组索引。因此,没有什么可以阻止
index()
返回映射项的键

此查询在hibernate上运行良好:

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

p.phoneNumbers是什么类型的?类型为“Map”的实体属性。key()应该用于Map,而不是index()@James我不知道
key()
,但已经测试了
index()
,它可以工作。