2011-11-07 9 views
2

エンティティAとBがあり、AはBのセットを持つことができます。Bの同じインスタンスは複数のAに属することができます。したがって、古典的な多対多ここの関係。JPAとGoogleの多対多の関係

GAEでは、多対多リレーションシップの直接的なサポートはありません。代わりに、関連リレーションにキーセットを使用する機能を提供しています。したがって、AではBのレコードのキーのセットを維持します。

問題は次のとおりです。 - タイプAのオブジェクトに属し、特定の基準に一致するタイプBのオブジェクトをクエリするにはどうすればよいですか?プレーンなSQLでは、私はそのようにします:

select B.* 
from 
    B inner join A 
     on B.A_ID=A.ID 
where B.property0=criteria1 
     and B.property1=criteria2 ... 
     and ... 

が、私はその後、私は、クエリ自体が原因でIDの量を非常に長くなること

select B.* 
from B 
where B.A_ID in (...) 
     and B.property0=criteria1 
     and B.property1=criteria2 ... 
     and ... 

のような何かをする必要がありJOINを行うことはできませんので、 。

もっと良い方法がありますか?

答えて

1

リレーションシップマッピングをリファクタリングすると、より良いクエリを取得できます。代わりにAのキーのセットを格納する、そして、あなたは

select * from B where a_id = {idOfRelevantA} and property0 = {criterion0} and property1 = {criterion1}... 

あなたはinオペレータが作成する複数のクエリを避けるため、この方法で照会することができますBのキーのセットを格納します。

また、inは30個以下の要素のリストに対してのみ機能します。