2013-05-13 70 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;