Reputation: 6583
I need to use @OrderBy (JPA, Hibernate as provider) to sort collection for nested property:
@OneToMany(mappedBy = "paramSpec", cascade = CascadeType.ALL)
@OrderBy("release.ordinal")
private List<PkdbParameter> pkdbParams;
In PkdbParameter.java:
...
@ManyToOne
@JoinColumn(name = "release_id")
private Release release;
...
In Release.java:
...
private int ordinal;
...
(all of these fields have simple getters and setters provided)
Unfortunately I'm getting error:
Caused by: org.hibernate.AnnotationException: property from @OrderBy clause not found: some.package.PkdbParameter.release.ordinal
What's wrong with this code? If it's impossible to use nested properties notation is there any other way to order for ordinal
property?
Upvotes: 13
Views: 11510
Reputation: 153730
You can use the Hibernate @SortComparator
annotation:
Like this:
@OneToMany(mappedBy = "paramSpec", cascade = CascadeType.ALL)
@SortComparator(ReleaseComparator.class)
private List<PkdbParameter> pkdbParams;
Where CameraNameComparator is:
public class ReleaseComparator implements Comparator<PkdbParameter> {
@Override
public int compare(PkdbParameter o1, PkdbParameter o2) {
return o1.getRelease().getOrdinal().compareTo( o2.getRelease().getOrdinal() );
}
}
Upvotes: 11
Reputation: 1602
You can split the order statements and place it on non collection properties:
@OneToMany(mappedBy = "paramSpec", cascade = CascadeType.ALL)
@OrderBy("release")
private List<PkdbParameter> pkdbParams;
and
@ManyToOne
@JoinColumn(name = "release_id")
@OrderBy("ordinal")
private Release release;
As a side effect, you have fixed sort order for PkdbParameter.
Upvotes: 0
Reputation: 1384
@OrderBy
works only with direct properties or embedded attributes. From Java EE 6 docs
The dot (".") notation is used to refer to an attribute within an embedded attribute
So if the Release
is an embedded attribute, this could work. Otherwise you could use named query as suggested here
Upvotes: 4