2011-05-25 123 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'之类的东西,这会减少构建的索引数量。

当然,这意味着你不能有任意的搜索功能......但选择较少并不总是对用户体验不利。