2017-03-02 85 views
0

在我的模式中,我有一个表Cutter,PropertyPropertyValue。部分列:通过相关属性对Hibernate @OneToMany进行排序?

Cutter 
    id 

Property 
    id 
    name 
    desc 

PropertyValue 
    property_id 
    cutter_id 
    value 

我想要做的事,如:

@Entity 
@Table(name = "Cutter") 
public 
class 
Cutter implements Serializable 
{ 
    @OrderBy("property.name asc") 
    @OneToMany(mappedBy = "cutter") protected SortedSet<PropertyValue>  properties; 
} 

但是,这将导致明显的例外:Unknown column 'properties0_.property.name' in 'order clause'

我制作PropertyValue实施Comparable,但这似乎不够。无论如何,Hibernate想要注释@OrderBy

+0

是'name'属性'PropertyValue'?如果是,只需使用'@OrderBy(“name asc”)' – jorgegm

+0

@jorgegm,抱歉如果不清楚,但不是,'name'是'Property'的属性,这就是为什么这不直截了当。 – Rick

+0

ops,我没有注意到它。根据OrderBy的javadoc,这是不可能的:“属性或字段名称必须与其中的关联类或嵌入类的持久性属性或字段相对应。”一个可行的解决方案是使用'List '并实现'@ PostLoad'方法来构建'SortedSet'。 – jorgegm

回答

1

您应该可以使用Comparable并注释SortedSet属性@Sort(type = SortType.NATURAL)允许Hibernate将其排序在内存中。

+0

我发现'@ org.hibernate.annotations.SortNatural',它似乎给了我想要的行为,但我不知道这会对性能产生什么样的影响。幸运的是,每个“Cutter”只有少数几个属性。谢谢! – Rick

+1

如果您发现自己查询了许多可能需要访问这些属性值的'Cutter'实例,则还可以使用'@ BatchSize'来最小化N + 1选择开销。显然,让数据库执行排序是理想的,但只要注意它并确定配置文件即可。 – Naros

相关问题