【问题标题】:JDO Query ordering issueJDO 查询排序问题
【发布时间】:2011-05-25 09:51:11
【问题描述】:

我有一个 JDO 查询,它过滤“人”实体的两个属性,我们称它们为“年龄”和“身高”。我希望按人员“分数”排序结果。但是,由于 App Engine 施加的限制,我首先必须按年龄或身高排序。所以我目前有

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

我真的对按年龄排序的结果不感兴趣,我只需要包含它以使查询工作(因为我已经过滤了年龄),我真的只需要按分数排序的结果。

有没有办法让结果按分数排序并有效地忽略年龄排序?

谢谢

【问题讨论】:

  • 除了完全删除排序,并在内存中对结果进行排序,我没有看到任何解决方案。
  • 在这种情况下,有什么方法可以设置排序的重要性,即按分数排序,然后按年龄排序,而不是反过来?
  • 没有。 code.google.com/intl/fr/appengine/docs/java/datastore/… 说:“如果查询同时具有不等式比较的过滤器和一个或多个排序顺序,则查询必须包含不等式中使用的属性的排序顺序,并且排序顺序必须出现在其他排序顺序之前属性。”
  • 是的,我读到了,我一直抱着错误的希望,希望有人可以解决这个烦人的限制!

标签: java google-app-engine jdo


【解决方案1】:

您不能先按分数排序,因为没有索引可以支持该查询。

我看到推荐的解决方案/解决方法是选择几个预定义的年龄范围,预先计算每个 Persons 成员到这些范围,然后对该成员使用相等过滤器,以便您可以按score.

例如,如果您选择“Person 添加三个布尔属性。然后你可以做一个查询,比如“select * from Person where isUnder13 = true order by score”。我想在这种情况下,由于成员资格是互斥的,您可以使用单个枚举属性并搜索类似 ageRange = 'UNDER_13' 的内容,这将减少构建的索引数量。

当然,这意味着您不能拥有任意搜索功能……但选择较少并不总是不利于用户体验。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-02-03
    • 2012-03-10
    • 1970-01-01
    • 2020-12-18
    • 2010-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多