4

如果有这样的关系:

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 这样的提供可以提供排序器,以便可以包含一个比较器类,但我的问题是,@OrderBy在一般 JPA 2.0 规范中是否有关于子关系的规范?如果没有,那么 OpenJPA 是否有任何这些排序器实现?有什么替代方案?

4

2 回答 2

4

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

指定为 orderby_item 的属性或字段名称必须对应于其中关联类或嵌入类的基本持久属性或字段。排序中使用的属性或字段必须对应于支持比较运算符的列。

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

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

于 2013-05-13T18:29:42.097 回答
-1

尝试这个

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;
于 2014-01-24T08:04:16.787 回答