Как создать индекс с JPA/hibernate и использовать поля из MappedSuperClass вместе с полями из конкретной сущности

У меня есть @MappedSuperClass (упрощенный пример):

@MappedSuperclass
public abstract class MySuperClass {

    @Id
    @GeneratedValue
    private long id;

    @Column(nullable = false)
    private Date creationDate;

    // ...
}

и конкретный Entity (упрощенный пример):

@Entity
public class MyEntity extends MySuperClass {
    @Index(name = "IDX_MYINDEX")
    @Column(nullable = false)
    @Enumerated(EnumType.STRING)
    private MyType type;

    @Index(name = "IDX_MYINDEX")
    @Column(nullable = false)
    @Enumerated(EnumType.STRING)
    private MyResult status;

    // ...
}

Теперь мне нужен индекс, включающий столбцы MySuperClass.creationDate, MyEntity.status и MyEntity.type.

Если я добавлю @Index(name = "IDX_MYINDEX") в MySuperClass.creationDate, то hibernate добавит индекс creationDate для каждой сущности, унаследованной от MySuperClass.

Я пробовал @AttributeOverride, но он не подходит для индексов.

Есть идеи? ТИА!

Ответ 1

Если вы используете JPA 2.1, вы можете использовать аннотацию класса @Table со своими индексами атрибутов

@Table(indexes = { @Index(name = "IDX_MYIDX1", columnList = "id,name,surname") })

Обратите внимание, что, как говорится в документации,

Они используются, только если генерируется генерация таблицы. По умолчанию нет дополнительные индексы.

columnlist, как показано выше, принимает список имен столбцов в виде списка с разделителями-запятыми.

Если вы не используете JPA 2.1, вы можете просто использовать старую аннотацию Hibernate @Index (обратите внимание, что это уже устарело). Там атрибут columnNames, где вы можете передать массив имен столбцов, независимо от того, в каком поле оно объявлено.

@Index(name = "IDX_MYIDX1", columnNames = { "id", "name", "surname"})

Ответ 2

Используйте аннотацию @Index и используйте параметр "columnList", чтобы указать, какие столбцы следует использовать для создания вашего индекса. Этот список должен быть составлен из списка значений имен столбцов, разделенных запятыми.

Важно. Не забудьте добавить свойство имени столбца (через аннотацию столбца) ко всем свойствам этого индекса, иначе вы получите сообщение об ошибке при запуске своего контейнера.

Ответ 3

@Table(name = "table_name",indexes = [Index(name = "name_of_index", columnList = "liste of fields separated by ',' ")])