2010-01-20 58 views
0

我有两个对象,条目和样本。每个条目都有一组相关的样本,每个样本都有一个与其相关的投票。我需要在数据库中查询所有条目,但对于每个条目,我需要相关的样本集合排序根据他们的投票属性:基于嵌套路径订购属性的Hibernate查询

public Class Entry{ 
    Set<Sample> samples; 
} 

public Class Sample{ 
    int vote; 
} 

我想我已经进行了查询后排序样本名单,但事实证明这是一团糟,因为不能在hibernate集合和java集合之间进行转换。有人可以帮我改变我的查询来获得我需要的结果吗?

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

回答

2

我发现了一个令人尴尬的简单的解决这个问题。有一个完美的@OrderBy JPA注释:

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

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

  1. 使用的SortedSet或SortedMap的,在某种属性或或指定一个比较级。这个解决方案在内存中进行排序。

  2. 指定排序依据的表列列表的排序依据属性或命名。此解决方案仅适用于JDK 1.4+。

  3. 使用过滤session.createFilter(收集, “为了通过......”).LIST()

+0

感谢您的回答和链接。但是,我仍然不理解如何通过查询来构建订单。我不想订购我收到的结果集,我想订购其中一个属性的集合中的元素,它是一个集合 – 2010-01-20 22:07:43

+0

除了你发现自己的解决方案,你自己选择1和3也适用于集合属性(例如样本在你的情况)。所以你可以这样做: session.createFilter(entries.getSamples(),“order by votes”)。list() – 2010-01-21 06:49:16

+0

这些方法给了你更多的灵活性:你可以在不同情况下使用不同的样本顺序。但是如果你总是需要相同的顺序,你的方法很棒 – 2010-01-21 06:50:37