2017-03-02 133 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

相關問題