定义列表的顺序

10

我遇到了一个问题。我有三个类A、B和C。A包含一个OneToMany关系列表,其中包含B。B包含一个ManyToOne关系到C。C包含一个名为"name"的字段,而B也包含一个名为"name"的字段。我想要实现的是,将A列表中的项按照C的名称为第一排序依据,B的名称为第二排序依据进行排序,但问题是我不知道如何做到这一点。是否可能实现呢?

我使用的JPA提供程序是EclipseLink。


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

编辑 是的,我尝试过不同的变体,比如 @OrderBy("c.name") 不起作用,我只会得到一个错误信息,告诉我实体类 b 中不存在名为 "c.name" 的字段。

5个回答

13

不可能。@OrderBy 只接受直接属性 / 字段名称,而不是嵌套属性。这真的很有道理,因为 "c" 表 - 根据你的获取策略可能甚至不是检索 "b" 的 select 语句的一部分。


3

ChssPly76 是正确的。

你可以创建一个类似这样的命名查询:

 SELECT b 
 FROM B b 
 WHERE b.a = :mya 
 ORDER BY b.c.name

0
你试过了吗:
 @OrderBy("c.name ASC", "name ASC")

?


0
你尝试过使用 @OrderBy("c.name", "name") 吗?
不应该使用 "b.",因为 @OrderBy 隐含地认为将在 b 数组的 B 实例列上执行排序。

0

在javax.persistence.OrderBy中不可能实现(如ChssPly76所说),但是当我使用Hibernate时,我使用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有同样的功能?

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接