2013-05-13 68 views
2

訂購,如果有這樣的關係:@OrderBy註釋無法通過子關係

entity A (one) ---> (many) entity B (one)---->(one) entity C 

和電流JPA實體中有以下關係定義:

@OneToMany(mappedBy = "A", fetch = FetchType.EAGER, cascade = CascadeType.ALL) 
@OrderBy("b.c.fieldFromC DESC, field1FromB, field2FromB") // <--- b.c.fieldFromC DESC becomes a problem 
private List<B> b_List; 

看來,如果b爲@OrderBy纔有效在一個條件下(因爲b是A的一個字段)但不適用於B(子關係)的任何字段,總之,@OrderBy只對Ab有效但不是Abc

我們使用的是OpenJPA,我知道像Hibernate這樣的提供可以提供分類器,因此可以包含一個比較類,但是我的問題是,是否有任何關於@OrderBy的規範通過泛型JPA 2.0規範中的子關係?如果沒有,那麼,OpenJPA是否有這些分揀器的實現?有什麼可以替代的?

回答

3

是的,它在JPA指定2.0規範 - @OrdedBy不通過按照列表中的相關實體實體的屬性支持順序:

指定爲orderby_item屬性或字段的名稱必須與 到相關類的基本持久性屬性或字段或其中的嵌入類。 排序中使用的屬性或字段必須對應於支持比較運算符爲 的列。

點(「。」)表示法用於引用 嵌入屬性中的屬性。與點 表示法一起使用的每個標識符的值是相應嵌入字段或屬性的名稱。

一種替代方法是創建比較器(以Java而不是SQL排序),並將其用於以首選順序返回列表的自定義方法中。

+0

謝謝你,不支持的實體的屬性在這裏沒有好,我終於做出了一個變通使用比較在getter方法返回實體列表時。謝謝。 – Dreamer 2013-05-14 03:05:01

0

試試這個

A類

@OrderBy("c_fieldFromC DESC") 
private List<B> b_List; 

B類

@Column(name = "(SELECT field_from_c FROM c WHERE c.id = b.c_id)", insertable = false, updatable = false 
private String c_fieldFromC;