如果存在这样的关系:
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是否有任何分拣机实施?什么可以替代?
答案 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;