【问题标题】:Defining the order of a list定义列表的顺序
【发布时间】:2009-07-09 16:43:57
【问题描述】:

我有以下问题。我有三个类,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;
}

编辑 是的,我尝试了不同的变体,例如 @OrderBy("c.name") 不起作用,我只是收到一条错误消息,告诉我实体类 b 不包含名为“c.name”的字段。

【问题讨论】:

    标签: java jpa


    【解决方案1】:

    这是不可能的。 @OrderBy 仅接受直接属性/字段名称,不接受嵌套属性。这是有道理的,真的,因为“c”表 - 取决于您的获取策略,甚至可能不是为检索您的“b”而发出的选择的一部分。

    【讨论】:

      【解决方案2】:

      ChssPly76 是对的。

      你可以做的是创建一个像这样的命名查询:

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

      【讨论】:

        【解决方案3】:

        你试过@OrderBy("c.name", "name")吗?

        您不应该使用“b”。因为它暗示 @OrderBy 将在 b 数组上 B 的实例的列上完成。

        【讨论】:

          【解决方案4】:

          你试过了吗:

           @OrderBy("c.name ASC", "name ASC")
          

          ?

          【讨论】:

            【解决方案5】:

            这在 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 可能有同样的可能性吗?

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2021-04-02
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2023-03-18
              • 1970-01-01
              • 2017-07-06
              • 1970-01-01
              相关资源
              最近更新 更多