@OrderBy注释不能按子关系排序

时间:2013-05-13 14:40:54

标签: spring java-ee jpa ejb openjpa

如果存在这样的关系:

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

当前的JPA实体A具有以下关系定义:

@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;

似乎@OrderBy仅在b处于条件状态时才有效(因为b是A的字段)但不适用于B(子关系)的任何字段,简而言之,@OrderBy仅对Ab有效但不是Abc

我们正在使用OpenJPA,我知道像Hibernate这样的提供可以提供分类器,因此可以包含一个比较器类,但我的问题是,在一般的JPA 2.0规范中是否有关于@OrderBy的子关系的规范?如果没有,那么OpenJPA是否有任何分拣机实施?什么可以替代?

2 个答案:

答案 0 :(得分:4)

是的,它在JPA 2.0规范中指定 - @OrdedBy不支持与列表中的实体相关的实体的属性顺序:

  

指定为orderby_item的属性或字段名称必须对应   到相关类的基本持久属性或字段或   嵌入式课程。中使用的属性或字段   排序必须对应于比较运算符所在的列   支撑。

     

点(“。”)表示法用于表示一个中的属性   嵌入属性。与点一起使用的每个标识符的值   notation是相应嵌入字段或属性的名称。

另一种方法是创建Comparator(使用Java而不是SQL排序)并在自定义方法中使用它,该方法以首选顺序返回列表。

答案 1 :(得分: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;