Выборка и сортировка данных отображаемых коллекций оператором ORDER BY вызываемым аннотацией @org.hibernate.annotations.OrderBy

Если отображаемый класс содержит поле типа коллекции, поддерживающей порядок элементов, например, List<String> emails, то с помощью аннотации @org.hibernate.annotations.OrderBy можно указать Hibernate’у добавлять в конец запроса на выборку выражение ORDER BY… с произвольным правилом сортировки. В результате данные в такую коллекцию попадут отсортированными ещё в БД.

Отметим, что это произвольное правило может содержать функции БД и вообще практически любой произвольный SQL, что может сделать такой подход зависимым от вендора СУБД.

Читать далее

Выборка и сортировка данных отображаемых коллекций оператором ORDER BY вызываемым аннотацией @javax.persistence.annotations.OrderBy

Если отображаемый класс содержит поле типа коллекции, поддерживающей порядок элементов, например, List<String> emails, то с помощью аннотации @javax.persistence.annotations.OrderBy можно указать Hibernate’у добавлять в конец запроса на выборку выражение ORDER BY COLUMN_NAME ASC. В результате данные в такую коллекцию попадут отсортированными ещё в БД.

Читать далее

Автоматическая сортировка отображаемых коллекций типа Set и Map методом compareTo() с помощью аннотации @SortNatural

Если отображаемый класс содержит поля типа SortedMap или SortedSet, то их можно пометить аннотацией @SortNatural. И тогда после выборки данных из БД, если они, как большинство базовых типов, имплементируют интерфейс Comparable, то они будут отсортированы методом compareTo() и будут доступны в этих полях уже в отсортированном виде.

Отметим, что при таком подходе сортировка будет проведена в java-приложении. Если нужна сортировка выборки на стороне БД, то это делается аннотациями @javax.persistence.annotations.OrderBy или @org.hibernate.annotations.OrderBy.

Читать далее

Автоматическая сортировка отображаемых коллекций типа Set и Map любым компаратором с помощью аннотации @SortComparator

Если отображаемый класс содержит поля типа SortedMap или SortedSet, то их можно пометить аннотацией @SortComparator. И тогда после выборки данных из БД они будут отсортированы с помощью заданного java-компаратора и будут доступны в этих полях уже в отсортированном виде.

Отметим, что при таком подходе сортировка будет проведена в java-приложении. Если нужна сортировка выборки на стороне БД, то это делается аннотациями @javax.persistence.annotations.OrderBy или @org.hibernate.annotations.OrderBy.

Читать далее

Отображение поля типа Map в отдельную таблицу в Hibernate с помощью аннотаций @ElementCollection и @CollectionTable

Если отображаемый класс содержит поле типа Map, параметризованное базовыми типами (<String, String>, <Integer, Boolean> и т.п.), то данные этого поля не могут быть отображены просто в колонку соответствующей таблицы. Их необходимо отобразить в отдельную таблицу с внешним ключом на id основной.

Например, если класс Person содержит поле Map<String, Boolean> emails, то список адресов электронной почты конкретного человека не может храниться с ним в одной таблице PERSON, нужно завести для них отдельную таблицу EMAILS и хранить там. Hibernate позволяет решить эту задачу, не создавая отдельный класс-сущность Email, а просто разметив поле Map<String, Boolean> emails аннотациями @ElementCollection, @CollectionTable, @MapKeyColumn и @Column.

Читать далее

Отображение поля типа List в отдельную таблицу с поддержкой порядка элементов в Hibernate с помощью аннотаций @ElementCollection и @CollectionTable

Если отображаемый класс содержит поле типа List, параметризованный базовым типом (<String>, <Integer>, и т.п.), то данные этого поля не могут быть отображены просто в колонку соответствующей таблицы. Их необходимо отобразить в отдельную таблицу с внешним ключом на id основной.

Например, если класс Person содержит поле List<String> emails, то список адресов электронной почты конкретного человека не может храниться с ним в одной таблице PERSON, нужно завести для них отдельную таблицу EMAILS и хранить там. Hibernate позволяет решить эту задачу, не создавая отдельный класс-сущность Email, а просто разметив поле List<String> emails аннотациями @ElementCollection и @CollectionTable.

Так как в данном случае речь идёт о поле типа List, то элементы будут считаться упорядоченными, что позволит с помощью аннотации @OrderColumn задать отдельную колонку для хранения данных о порядке элементов.

Читать далее

Отображение поля типа Set в отдельную таблицу в Hibernate с помощью аннотаций @ElementCollection и @CollectionTable

Если отображаемый класс содержит поле типа коллекции базового типа, например, Set<String>, то данные этого поля не могут быть отображены просто в колонку соответствующей таблицы. Их необходимо отобразить в отдельную таблицу с внешним ключом на id основной.

Например, если класс Person содержит поле Set<String> emails, то список адресов электронной почты конкретного человека не может храниться с ним в одной таблице PERSON, нужно завести для них отдельную таблицу EMAILS и хранить там. Hibernate позволяет решить эту задачу, не создавая отдельный класс-сущность Email, а просто разметив поле Set<String> emails аннотациями @ElementCollection и @CollectionTable.

Так как в данном случае речь идёт о поле типа Set, то элементы будут считаться не упорядоченными. Если необходимо поддерживать порядок элементов, то поле должно иметь тип List.

Читать далее

Отображение в БД иерархии наследования встраиваемых @Embeddable классов в Hibernate

Если классы-значения, встраиваемые в классы-сущности, организованы в виде иерархии, то при их отображении в БД необходимо учитывать разветвлённость этой иерархии. Если иерархия никак не ветвится, то есть у каждого предка в цепочке наследования есть только один потомок, то ничего особого предпринимать не нужно, достаточно делать стандартную разметку аннотацией @Embeddable.

Если у какого-то из встраиваемых классов-предков более одного потомка, то есть иерархия наследования начинает ветвиться, то может понадобиться более тонкая разметка классов аннотациями.

Читать далее

Отображение в структуру БД иерархии наследования Java с совмещением нескольких стратегий одновременно

Классы сущностей Java могут иметь иерархическую структуру и существует ряд стратегий отображения этой структуры в БД. В частности используются подходы «отдельная таблица на каждый конкретный класс» и «одна таблица для всех наследников». У каждого из подходов есть свои преимущества и недостатки. Hibernate позволяет использовать эти две стратегии одновременно.

Например, если у нас есть класс Person и у него три наследника: Client, Employee и Freelancer, мы можем хранить данные двух наследников (Client и Employee) в одной таблице, а данные Freelancer в отдельной таблице, у которой будет внешний ключ на id общей таблицы.

Читать далее

Отображение в структуру БД иерархии наследования Java по принципу «отдельная таблица на каждый уровень иерархии наследования» с учётом полиморфизма с помощью Hibernate

Классы сущностей Java могут иметь иерархическую структуру и существует ряд стратегий отображения этой структуры в БД. Одной из стратегий является отображение каждого класса, представляющего собой очередной уровень иерархии наследования в отдельную таблицу.

Каждая таблица, хранящая данные очередного класса-наследника, содержит колонку с внешним ключом, ссылающимся на таблицу, хранящую данные класса предка. Выборка данных, таким образом, происходит через JOIN всех таблиц, соответствующей ветви иерархии наследования.

То есть, если классы SpecialClient наследует класс Client, а от в свою очередь наследует класс Person, то для отображения данных будут созданы три таблицы (SPECIAL_CLIENT, CLIENT и PERSON), при этом в таблице SPECIAL_CLIENT будет внешний ключ, ссылающийся на CLIENT, а у той — внешний ключ, ссылающийся на PERSON.

Читать далее