У меня проблема с hibernate, когда он выполняет N + 1 SELECTS при использовании объекта DTO.
Например, этот запрос JPQL:
SELECT com.acme.MyDto(t) FROM Thing t
Где конструктор MyDtoэто что-то вроде:
public MyDto(Thing t) {
...
}
Что приводит к запросу чего-то вроде:
SELECT t.id FROM thing t WHERE condition
, за которым следуют все отдельные запросы для каждой строки, то есть:
SELECT t.id, t.column1, t.column2 FROM thing t WHERE t.id = 1
SELECT t.id, t.column1, t.column2 FROM thing t WHERE t.id = 2
SELECT t.id, t.column1, t.column2 FROM thing t WHERE t.id = 3
...
Однако, если конструктор не принимает Entity, а вместо этого каждый отдельный столбец, то hibernate ведет себя так, как вы ожидаете, то есть:
public MyDto(Integer id, String column1, String column2) {
...
}
Тогда сгенерированный SQL выглядит так:
SELECT t.id, t.column1, t.column2 FROM thing t WHERE condition
Помимо создания конструкторов DTO, которые занимают каждый столбец, есть ли способ коаксиального спящего режима, чтобы просто выбрать все столбцы сразу с начала?
Таблица, с которой мы работаем, имеет 100+ столбцы разбросаны по встраиваемым объектам, поэтому довольно сложно поддерживать огромный конструктор.Таблица чрезвычайно нормализована и не имеет соединений.