Hibernate @OrderBy для вложенных свойств
мне нужно использовать @OrderBy (JPA, Hibernate как поставщик) для сортировки коллекции для вложенного свойства:
@OneToMany(mappedBy = "paramSpec", cascade = CascadeType.ALL)
@OrderBy("release.ordinal")
private List<PkdbParameter> pkdbParams;
В PkdbParameter.java:
...
@ManyToOne
@JoinColumn(name = "release_id")
private Release release;
...
В Релизе.java:
...
private int ordinal;
...
(все эти поля имеют простые геттеры и сеттеры)
к сожалению, я получаю ошибку:
Caused by: org.hibernate.AnnotationException: property from @OrderBy clause not found: some.package.PkdbParameter.release.ordinal
что не так с этим кодом? Если невозможно использовать нотацию вложенных свойств, есть ли другой способ заказать ordinal
собственность?
3 ответов
@OrderBy
работает только с прямыми свойствами или встроенный атрибутами. От Java EE 6 docs
точка (".") нотация используется для ссылки на атрибут внутри встроенного атрибута
Итак, если Release
является встроенным атрибутом, это может работать. В противном случае вы можете использовать именованный запрос, как предложено здесь
вы можете использовать Hibernate @SortComparator
аннотация:
такой:
@OneToMany(mappedBy = "paramSpec", cascade = CascadeType.ALL)
@SortComparator(ReleaseComparator.class)
private List<PkdbParameter> pkdbParams;
где CameraNameComparator является:
public class ReleaseComparator implements Comparator<PkdbParameter> {
@Override
public int compare(PkdbParameter o1, PkdbParameter o2) {
return o1.getRelease().getOrdinal().compareTo( o2.getRelease().getOrdinal() );
}
}
вы можете разделить операторы order и поместить их в свойства non collection:
@OneToMany(mappedBy = "paramSpec", cascade = CascadeType.ALL)
@OrderBy("release")
private List<PkdbParameter> pkdbParams;
и
@ManyToOne
@JoinColumn(name = "release_id")
@OrderBy("ordinal")
private Release release;
в качестве побочного эффекта у вас есть фиксированный порядок сортировки для PkdbParameter.