Как заставить JPA использовать составной порядок индексов первичного ключа

#java #hibernate #jpa #orm

#java #спящий режим #jpa #orm

Вопрос:

Имя таблицы: Передача

Столбцы: ИДЕНТИФИКАТОР, КЛЮЧ, НОМЕР ПЕРЕДАЧИ, ИМЯ_ФАЙЛА, ИМЯ_ФАЙЛА

Составными первичными ключами таблицы Transfer являются: ИДЕНТИФИКАТОР, КЛЮЧ, TRANSFER_NUMBER

Определение индекса таблицы переноса INDEX1: ИДЕНТИФИКАТОР ASC, КЛЮЧ ASC, НОМЕР ПЕРЕДАЧИ ASC

Передача pojo

 @Entity
@Table(name = "TRANSFER", indexes = { @Index(name = "INDEX1", columnList = "identifier,key,transferNbr") })
@Getter
@Setter
@DynamicUpdate
public class Transfer implements Serializable, Cloneable {

    private static final long serialVersionUID = 1L;

    @EmbeddedId
    private TransferPk id;
    
    @Column(name = "FIRST_NAME")
    private String firstName;
    
    @Column(name = "LAST_NAME")
    private String lastName;
 

TransferPk pojo

         @EqualsAndHashCode
        @Getter
        @Setter
        @Embeddable
        public class TransferPk implements Serializable {

        private static final long serialVersionUID = 1L;

        @Column(name = "IDENTIFIER")
        private String identifier;
        @Column(name = "KEY")
        private int key;
        @Column(name = "TRANSFER_NUMBER")
        private String transferNbr;
 

Код для извлечения передачи

     TransferPk id = new TransferPk();
    id.setIdentifier("123");
    id.setKey(456);
    id.setTransferNbr("789");
    // This JPA query also uses the reverse Transfer of index
    Optional<Transfer> Transfer = TransferRepo.findById(id);
 

Я могу получать данные из БД без каких-либо проблем, а HQL

     select <all fileds> from TRANSFER transfer0_ where transfer0_.TRANSFER_NUMBER=? and transfer0_.KEY=? and transfer0_.IDENTIFIER=?
 

Хотя мы использовали аннотацию indexes, JPA по-прежнему не использует индекс, определенный в таблице переноса (INDEX1), и, следовательно, повторная загрузка занимает больше времени.

Как заставить JPA использовать порядок индексов. Любая помощь высоко ценится. Спасибо

Ответ №1:

Я не знаю, что вы подразумеваете под «порядком индекса», но вы используете имена атрибутов JPA в @Index аннотации, что неверно. Используйте имена столбцов, такие как @Index(name = "INDEX1", columnList = "identifier,key,transfer_number")

Комментарии:

1. Спасибо, Кристиан. Я пробовал с именем атрибута, и ниже приведена ошибка. Invocation of init method failed; nested exception is org.hibernate.AnnotationException: Unable to create index (identifier, key, transferNbr) on table TRANSFER: database column 'identifier', 'key', 'transferNbr' not found. Make sure that you use the correct column name which depends on the naming strategy in use (it may not be the same as the property name in the entity, especially for relational types)

2. Я сказал вам использовать имена столбцов: D использование имен атрибутов неверно

3. Opps. Ok. Tried имя столбца и выше — это результат. Спасибо

Ответ №2:

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

В вашем случае это было бы:—

 @Table(name = "TRANSFER", indexes = { @Index(name = "INDEX1", columnList = "IDENTIFIER,KEY,TRANSFER_NUMBER ASC") })
 

«DESC / ASC» используется для порядка индекса.

Надеюсь, это должно решить вашу проблему.

Комментарии:

1. Спасибо privranjan. Пробовал как ASC, так и DESC, но по-прежнему не выбран правильный порядок индексов Выполнен HQL select <all fileds> from TRANSFER transfer0_ where transfer0_.TRANSFER_NUMBER=? and transfer0_.KEY=? and transfer0_.IDENTIFIER=? Ожидаемый HQL shoiuld быть select <all fileds> from TRANSFER transfer0_ where transfer0_.IDENTIFIER=? and transfer0_.KEY=? and transfer0_.TRANSFER_NUMBER=?

2. у нас есть данные appr 1B в таблице, а порядок индексов в DB2 is IDENTIFIER,KEY,TRANSFER_NUMBER . Но JPA использовал порядок как TRANSFER_NUMBER,IDENTIFIER,KEY . ИТАК, мы сталкиваемся с проблемой производительности. Чтобы избежать этого, я пытаюсь заставить JPA использовать тот же order, который определен в DB2

3. Какую версию гибернации вы используете?

4. Проверьте с помощью hibernate 4.3.8 или 5.2.13. он не будет работать с версией 5.2.10

5. Моя версия 5.3.7