#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, который определен в DB23. Какую версию гибернации вы используете?
4. Проверьте с помощью hibernate 4.3.8 или 5.2.13. он не будет работать с версией 5.2.10
5. Моя версия 5.3.7