We would like to orderBy 2 columns in the Seam EntityQuery interface as well as the JPA model. How do we do this?
@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");
}
If you are talking about javax.persistence.OrderBy
, this annotation takes into parameter a list of comma separated properties (of the target entity) and order the collection accordingly. For example in your case, startTimeHrs asc, startTimeMins asc
.
From the JPA 1.0 specification:
9.1.28 OrderBy Annotation
The OrderBy
annotation specifies the
ordering of the elements of a
collection valued association at the
point when the association is
retrieved.
@Target({METHOD, FIELD}) @Retention(RUNTIME)
public @interface OrderBy {
String value() default "";
}
The syntax of the value ordering
element is an orderby_list, as
follows:
orderby_list::= orderby_item [,orderby_item]*
orderby_item::= property_or_field_name [ASC | DESC]
If ASC
or DESC
is not specified,
ASC
(ascending order) is assumed.
If the ordering element is not
specified, ordering by the primary key
of the associated entity is assumed.
The property or field name must
correspond to that of a persistent
property or field of the associated
class. The properties or fields used
in the ordering must correspond to
columns for which comparison operators
are supported.
Yes you can use @OrderBy
to order your queries.
@OrderBy("startTimeHrs, startTimeMins")
@OneToMany(...)
getBobjects() {
return bobjects;
}
Now whenever you are saying A.getBobjects()
they will be ordered. However, if you are using the EntityQuery way of retrieving the result you can override the getEjbql()
and put the order by there.
@Name("bList")
public class B extends EntityQuery {
@Override
public String getEjbql() {
return "select b from B b order by startTimeHrs, startTimeMins";
}
}
Or you can @Override
the getResultList()
to manipulate the collection there in your entityLists