Порядок возврата дочерних объектов в запросе JPA
Вопрос
Итак, если мой запрос JPA выглядит следующим образом:Select distinct p из родительского p left join извлекает p.дочерние элементы упорядочиваются по p.SomeProperty
Я корректно получаю результаты, упорядоченные с помощью p.SomeProperty, и я корректно извлекаю и заполняю свою коллекцию p.children.Но я бы хотел, чтобы мой запрос был чем-то вроде "упорядочить по p.SomeProperty, p.children.someChildProperty", чтобы коллекция, заполненная внутри каждого родительского объекта, была упорядочена по someChildProperty.
Это кажется интуитивно понятным, когда я думаю в терминах sql, который фактически генерируется для этих вызовов, но я думаю, что это не так, когда он пытается отобразить обратно на иерархические объекты.
Решение
Для сохранения порядка используйте Набор деревьев.Что касается сортировки коллекции внутри родительского элемента, просто сделайте это в своем коде, используя Компаратор.
Что ж, попробуйте это для определения вашей коллекции в вашем родительском классе сущностей.Я надеюсь, вы поняли мою точку зрения.
Вы можете использовать эту аннотацию JPA,
@javax.persistence.OrderBy(value = "fieldName")
или это специфичный режим гибернации,
@org.hibernate.annotations.OrderBy(clause = "FIELD_NAME asc")
и вы также можете использовать это,
@org.hibernate.annotations.Sort(type = SortType.NATURAL)
или
@org.hibernate.annotations.Sort(type = SortType.COMPARATOR)
В случае компаратора компаратор должен быть на месте.Другое может работать только с коллекциями строк.
Другие советы
Адил, по сути, уже все поняла.Вы также можете использовать их со списком, что может быть важно, если ваши коллекции содержат один и тот же объект более одного раза.