4

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

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

4

3 回答 3

8

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

此查询在休眠状态下完美运行:

SELECT p FROM Person p, in (p.phoneNumbers) number 
WHERE number = '867-5309' AND index(number) = 'home'
于 2011-08-27T14:00:27.790 回答
4

它应该工作:

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
于 2012-09-26T22:02:03.997 回答
1

JPA(2) 规范没有定义它在 MEMBER OF 中使用Map的语法(您最初指的是数组,但如果您有地图,我看不到相关性),因此您不能依赖任何语法对所有 JPA 实现都有效。由于 JPQL 不支持诸如 keySet 之类的 Java 方法,因此我看不到那些可能的值。它很可能只支持检查值是否存在,例如

'867-5309' MEMBER OF p.phoneNumbers

作为参考,在 JDOQL 中,你会做

p.phoneNumbers.containsKey('home');
p.phoneNumbers.containsValue('867-5309');
于 2009-10-10T16:32:32.757 回答