JQPL выберите внутри выберите

#java #spring #hibernate #jpql

Вопрос:

только что переключился на весеннюю загрузку с .NET Core, в .NET core мы можем легко вложить выбор внутри выбора, подобного этому:

  var result = from c in context.Cars
                         join br in context.Brands
                         on c.BrandId equals br.Id
                         join col in context.Colors
                         on c.ColorId equals col.Id
                         select new CarDetailDto
                         {
                             Id = c.Id,
                             BrandName = br.Name,
                             CarName = c.Name,
                             ColorName = col.Name,
                             DailyPrice = c.DailyPrice,
                             ModelYear = c.ModelYear,
                             CarImages = (from cimg in context.CarImages
                                          where cimg.CarId == c.Id
                                          select new CarImage
                                          {
                                              Id = cimg.Id,
                                              ImagePath = cimg.ImagePath,
                                              CarId = c.Id,
                                              Date = cimg.Date
                                          }).ToList()
                         };
 

Я тоже хочу сделать это в JPQL, но не смог решить

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

1. Что именно вы пытались сделать?

2. У меня есть сущность, в которой есть один ко многим внутри. Как и резюме с опытом работы , я должен JsonIgnore его из-за бесконечной рекурсии, я хочу получить список опыта работы внутри информации о резюме в DTO с аннотацией @Query, но я не мог написать, что JPQL В основном я хочу перевести этот запрос .NET поверх запроса JPQL

Ответ №1:

 @Query( select column1, column2, column3 from tablename1 where coluname=(select columname from tablename2 where columnname=abcd) )
 

Ваш JPQL-запрос должен выглядеть так, как описано выше.
Какой бы подзапрос вы ни написали с условием.

Если ваш запрос содержит 3 столбца, вам необходимо создать DTO с тем же именем столбца.

Если ваш запрос содержит список строк, то ваш фактический jpql будет выглядеть следующим образом.

 @Query( select column1, column2, column3 from tablename1 where coluname= 
(select columname from tablename2 where columnname=abcd) )
List<ResultDTO> findAllResultList(Parameter value); 
 

Выше он отображает результат в список объектов DTO для строк результатов.

Если ваш запрос извлекает одну строку, то ваш фактический jpql будет выглядеть следующим образом.

 @Query( select column1, column2, column3 from tablename1 where coluname= 
(select columname from tablename2 where columnname=abcd) )
ResultDTO findResult(Parameter value);
 

Один результат сопоставляется с одним объектом DTO.

Убедитесь, что имя столбца результатов и имя столбца DTO совпадают, используя репозиторий JPA, чтобы вызвать имена метода, который вы использовали для конкретного запроса.