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.