2011-07-21 11 views
1

私はここで間違って何を寄付しているのですか? 「すべてのフィルタが「等しい」フィルタである場合にのみ結合がサポートされます。クエリが実行されたとき。どのように私はそれを回避することができますか?なぜエラー "結合は、すべてのフィルタが '等価'フィルタである場合にのみサポートされます。

Query query = pm.newQuery(ItemInfo.class); 

if (lastSyncDate != null) { 
    query.declareVariables("DeviceInfo deviceInfo"); 
    query.setFilter("this.toDevices.contains(deviceInfo) && " + 
    "deviceInfo.phoneNumber == numberParam && createdDate > lastSyncDateParam"); 
    query.declareParameters("String numberParam, java.util.Date lastSyncDateParam"); 
    map.put("lastSyncDateParam", lastSyncDate); 
} else { 
    query.declareVariables("DeviceInfo deviceInfo"); 
    query.setFilter("this.toDevices.contains(deviceInfo) && deviceInfo.phoneNumber == numberParam"); 

    query.declareParameters("String numberParam"); 
} 
map.put("numberParam", "123456"); 
query.setOrdering("createdDate desc"); 

@PersistenceCapable(identityType = IdentityType.APPLICATION, detachable = "true") 
public class ItemInfo { 

    @PrimaryKey 
    @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY) 
    private Long id; 

    @Persistent 
    private String number; 

    @Persistent 
    private List<DeviceInfo> toDevices; 
} 

答えて

0

App Engineのデータストアは、リレーショナルではなく、サポートされていない参加するには、参照モデルにフィールドを使用して暗黙的にやっています。その代わりに、特定の電話番号を持つエンティティをフェッチし、そのエンティティのキ​​ーを使用して結果データセットをフィルタリングし、暗黙的な結合を排除する必要があります。

+0

このようにサブクエリを実行する方法は? – angelokh

+0

@angelokhサブクエリではありません。指定された電話番号のレコードに対して標準クエリを実行するだけです。次に、一致するレコードごとに、そのレコードを参照するレコードのクエリを実行します。 –

関連する問題