我有以下问题。我有三个类,A,B和C. A包含一个关于B:s的OneToMany关系列表。 B包含与C的ManyToOne关系.C包含名为“name”的字段,B还包含名为“name”的字段。我想要完成的是让A列表中的项目主要按C的名称排序,其次按B的名称排序 - 问题是我不知道如何做到这一点。它甚至可能吗?
我正在使用EclipseLink作为我的JPA提供程序。
class A {
@OneToMany
@OrderBy("b.c.name, b.name") <---- this is the problem
List<B> b;
}
class B {
@ManyToOne
C c;
String name;
}
class C {
String name;
}
EDIT 是的,我尝试了不同的变体,例如@ OrderBy(“c.name”)不起作用,我只是收到一条错误消息,告诉我实体类b不包含名为“c.name”的字段。
答案 0 :(得分:10)
这是不可能的。 @OrderBy只接受直接属性/字段名称,而不接受嵌套属性。这是有道理的,真的,因为“c”表 - 取决于你的提取策略,甚至可能不是为检索你的“b”而发出的选择的一部分。
答案 1 :(得分:2)
ChssPly76是对的。
您可以做的是创建一个像这样的命名查询:
SELECT b
FROM B b
WHERE b.a = :mya
ORDER BY b.c.name
答案 2 :(得分:0)
您是否尝试过@OrderBy("c.name", "name")
?
你不应该使用“b”。因为暗示@OrderBy将在b数组的B实例的列上完成。
答案 3 :(得分:0)
你试过了吗?
@OrderBy("c.name ASC", "name ASC")
答案 4 :(得分:0)
在javax.persistence.OrderBy中是不可能的(例如ChssPly76),但是当我使用Hibernate时,我在PLAIN SQL中用Formula()注释构造了新列,然后在其上进行了OrderBy:
class A {
@OneToMany
@OrderBy("orderCol") <---- reference to virtual column
List<B> b;
}
class B {
@ManyToOne
C c;
String name;
@org.hibernate.annotations.Formula(
"( select C_table.name as orderCol from C_table where C_table.id = id )"
) <------------------------------------------ join with plain SQL statment
String orderCol;
}
EclipseLink是否有相同的可能性?