【问题标题】:Hibernate Query that Orders an Attribute based on a nested path基于嵌套路径对属性进行排序的休眠查询
【发布时间】:2010-01-20 20:52:37
【问题描述】:

我有两个对象,条目和样本。每个条目都有一组关联的样本,每个样本都有一个与之关联的投票。我需要查询所有条目的数据库,但对于每个条目,我需要根据其投票属性排序的关联样本集:

public Class Entry{
    Set<Sample> samples;
}

public Class Sample{
    int vote;
}

我尝试在执行查询后对 Samples 列表进行排序,但结果却是一团糟,因为无法在 hibernate 集和 java 集之间进行转换。有人可以帮我修改查询以获得我需要的结果吗?

List<Entry> entries = jpaTemplate.find("from Entry");

【问题讨论】:

    标签: java hibernate hql


    【解决方案1】:

    我找到了一个非常简单的解决方案来解决这个问题。有一个可以完美运行的 @OrderBy JPA 注释:

    @OneToMany(cascade = {CascadeType.PERSIST, CascadeType.MERGE})
    @OrderBy("votes DESC")
    public Set<Sample> getSamples() {
        return samples;
    }
    

    【讨论】:

      【解决方案2】:

      根据休眠faq: 共有三种不同的方法:

      1. 使用 SortedSet 或 SortedMap,在 sort 属性或 or 中指定比较器类。此解决方案在内存中进行排序。

      2. 指定 或 的 order-by 属性,命名要排序的表列列表。此解决方案仅适用于 JDK 1.4+。

      3. 使用过滤器 session.createFilter(collection, "order by ...." ).list()

      【讨论】:

      • 感谢您的回答和链接。但是,我仍然不明白如何通过查询来构建订单。我不想订购我收到的一组结果,我想订购其中一个属性中的元素,这是一个 Set
      • 除了您发现自己的解决方案之外,上面的选项 1 和 3 也适用于集合属性(例如,您的案例中的示例)。所以你可以这样做: session.createFilter(entries.getSamples(), "order by votes").list()
      • 这些方法为您提供了更多的灵活性:您可以在不同的情况下使用不同的样本顺序。但是,如果您总是想要相同的顺序,那么您的方法很棒
      猜你喜欢
      • 2021-02-23
      • 1970-01-01
      • 1970-01-01
      • 2021-04-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-04
      • 2012-07-01
      相关资源
      最近更新 更多