Получить DTO со списком внутри с помощью JPA

#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 обрабатывать количество открытых подключений, которые ему необходимо установить.