JPQL 选择内部选择

Posted

技术标签:

【中文标题】JPQL 选择内部选择【英文标题】:JQPL select inside select 【发布时间】:2021-08-19 23:56:13 【问题描述】:

刚刚从 .NET Core 切换到 Spring Boot,在 .NET Core 中,我们可以轻松地将 select 嵌套在 select 中,如下所示:

 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 中这样做,但没能解决

【问题讨论】:

你到底尝试了什么? 我有一个内部有一对多的实体。就像具有工作经验的简历一样,由于无限递归,我必须将其 JsonIgnore,我想将简历信息中的工作经验列表获取到带有 @Query 注释的 DTO 但我无法编写 JPQL 基本上我想将那个 .NET 查询翻译成top to 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 存储库调用您用于特定查询的方法的名称。

【讨论】:

以上是关于JPQL 选择内部选择的主要内容,如果未能解决你的问题,请参考以下文章

如何在 JPQL 中选择随机 10 条记录?

JPQL 多对多 Dto 选择失败

JPQL 根据孙属性选择实体

在 JPQL 中选择每辆车的首次预订

使用 avg 和额外字段选择 jpql

在 JPQL 中可以选择 EXISTS() 吗?