#spring #spring-boot #jpa #spring-data-jpa
Вопрос:
Есть ли способ получить такой объект в рамках одного запроса в JPA?
data class PartcipantsDTO(
val max: Int,
val list: List<ParticipantCardDTO>
) // this one
ParticipantCardDTO(
val id: Long,
val name: String
)
Предполагая, что сущности выглядят так:
@Entity
ParticipantEntity(
@Id id: Long,
name: String,
@ManyToOne event: EventEntity
)
@Entity
EventEntity(
@Id id: Long,
@OneToMany participants: List<Long>
)
Для поиска по идентификатору события пытался выполнить запрос типа:
SELECT new com.***.ParticipantsDTO(
e.max,
SELECT new ParticipantCardDTO(
p.id,
p.name
)
)
FROM ParticipantEntity p, EventEntity e
WHERE p.id IN e.participants AND e.id = :id
Но это не работает
Я знаю, что это можно сделать с помощью 2 отдельных запросов, но я хочу избежать открытия 2 соединений из-за неэффективности
Комментарии:
1. вы можете запросить данные с помощью проекций jpa, а затем сопоставить этот список проекций со списком dto. docs.spring.io/spring-data/jpa/docs/current/reference/html/…
2. С JPA это невозможно.
3. Когда вы говорите
max
, вы имеете в виду количество участников мероприятия?4. Да, но это всего лишь фиктивный объект, главное-как сопоставлять записи с элементами списка на лету
Ответ №1:
вы можете получить статус участника с помощью JPA, а затем сопоставить его и список участников с DTO в Java, hibernate будет обрабатывать его свойства.
это связано с тем, что у hibernate есть кэш, и он сам решает проблемы с производительностью.
Комментарии:
1. Я согласен. Позвольте hibernate обрабатывать количество открытых подключений, которые ему необходимо установить.