定义列表的顺序

时间:2009-07-09 16:43:57

标签: java jpa

我有以下问题。我有三个类,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”的字段。

5 个答案:

答案 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是否有相同的可能性?