2011-05-25 89 views
0

我有一個JDO查詢過濾「Person」實體的兩個屬性,我們稱它們爲「年齡」和「高度」。我希望通過人員「評分」來排序結果。但是,由於App Engine強加的限制,我首先必須按年齡或高度進行排序。所以,我現在有JDO查詢訂購問題

query.setOrdering("age desc, score asc"); 

我真的不感興趣,結果按年齡被命令,我必須包括用於查詢工作(因爲我已篩選年齡),我真的只需要結果按分數排序。

有沒有辦法讓分數排序的結果有效地忽略年齡排序?

謝謝

+0

除了完全刪除排序,並將結果排序在內存中,我沒有看到任何解決方案。 – 2011-05-25 09:58:47

+0

在這種情況下,是否有任何設置排序I.e的重要性的方法。按分數排序,然後按年齡而不是其他方式? – Mylo 2011-05-25 10:20:44

+0

否。http://code.google.com/intl/fr/appengine/docs/java/datastore/queries.html#Restrictions_on_Queries說:「如果一個查詢同時包含一個不等式比較過濾器和一個或多個排序命令,查詢必須包含用於不等式的屬性的排序順序,排序順序必須出現在其他屬性的排序順序之前。「 – 2011-05-25 10:24:49

回答

0

由於沒有索引可以支持該查詢,所以不能先按分數排序。

的解決方案/解決方法我見過建議是選擇一些預先定義的年齡範圍,預先計算每個Person的會員到這些範圍,然後使用對會員的平等過濾器,使您可以通過score排序。例如,如果您選擇了「< 13」,「13-18」和「18+」作爲您的年齡範圍,則需要爲每個Person添加三個布爾屬性。然後,您可以執行一個查詢,如「select * from person where isUnder13 = true order by score」。我猜在這種情況下,因爲成員資格是互斥的,你可以使用一個枚舉屬性並搜索諸如ageRange = 'UNDER_13'之類的東西,這會減少構建的索引數量。

當然,這意味着你不能有任意的搜索功能......但選擇較少並不總是對用戶體驗不利。