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 选择内部选择的主要内容,如果未能解决你的问题,请参考以下文章