JP-QL(JPA 2.0)の「ElementCollection」マップフィールドに対してクエリ「メンバー」を実行

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)仕様がために、その構文を定義していないの地図のOF MEMBERでの使用(使用すると、配列に元々参照していますが、マップを持っている場合、私は関連性が表示されていません) 、その結果、あなたはすべてのJPA実装のために有効である任意の構文に依存することはできません。 JPQLキーセットのようなJavaメソッドをサポートしていないので、値はその後、私はそれらがそうであることを見ることができません。

のように、それは唯一、値の有無のチェックをサポートする可能性よりも、もっと
'867-5309' MEMBER OF p.phoneNumbers
参考のため、JDOQLに、あなたはどうなる

p.phoneNumbers.containsKey('home');
p.phoneNumbers.containsValue('867-5309');
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top