如何在两列上指定OrderBy子句

时间:2010-10-18 12:13:33

标签: hibernate jpa seam

我们想在Seam EntityQuery接口以及JPA模型中订购2列。我们怎么做?

@Entity
public class A{

@OrderBy(???) // should this be hardcoded here, is it database agnostic
List<B> bobjects;
}

@Entity
public class B {

   public short startTimeHrs;
   public short startTimeMins;
}

@Name("bList")
public class B extends EntityQuery {
        setOrderColumn("startTimeHrs, startTimeMins"); // Is this correct?
        setOrderDirection("asc");
}

2 个答案:

答案 0 :(得分:13)

是的,您可以使用@OrderBy订购查询。

@OrderBy("startTimeHrs, startTimeMins")
@OneToMany(...)
getBobjects() {
   return bobjects;
}

现在每当你说A.getBobjects()时,他们都会被命令。但是,如果您使用EntityQuery方法检索结果,则可以覆盖getEjbql()并在那里下订单。

@Name("bList")
public class B extends EntityQuery {
    @Override
    public String getEjbql() {
          return "select b from B b order by startTimeHrs, startTimeMins";
    }
}

或者您可以@Override getResultList()来操纵实体列表中的集合

答案 1 :(得分:11)

如果您正在讨论javax.persistence.OrderBy,则此注释会将参数列入逗号分隔的属性(目标实体的列表),并相应地对集合进行排序。例如,在您的情况下,startTimeHrs asc, startTimeMins asc

从JPA 1.0规范:

  

9.1.28 OrderBy Annotation

     

OrderBy注释指定了   排序的元素   收藏价值协会在   关联时的点   检索。

@Target({METHOD, FIELD}) @Retention(RUNTIME)
public @interface OrderBy {
String value() default "";
}
     

值排序的语法   element是orderby_list,as   如下:

orderby_list::= orderby_item [,orderby_item]*
orderby_item::= property_or_field_name [ASC | DESC]
     

如果未指定ASCDESC,   假定ASC(升序)。

     

如果订购元素不是   指定,按主键排序   假设相关实体。

     

属性或字段名称必须   对应于持久性的   相关的财产或领域   类。使用的属性或字段   在订购必须对应   比较运算符的列   得到支持。