提问人:Ems 提问时间:11/9/2023 最后编辑:Ems 更新时间:11/9/2023 访问量:33
如何将包含横向派生表的SQL查询转换为JPQL?
How to convert an SQL query which contains a lateral derived table to JPQL?
问:
我正在尝试将以下SQL查询转换为JPQL,以便将其放入Spring Data @Query中。我找不到任何提及此特定情况的文件。有没有人尝试过,并成功了?我想避免求助于本机查询。
`SELECT
salesperson.name,
max_sale.amount,
max_sale_customer.customer_name
FROM
salesperson,
-- calculate maximum size, cache it in transient derived table max_sale
LATERAL
(SELECT MAX(amount) AS amount
FROM all_sales
WHERE all_sales.salesperson_id = salesperson.id)
AS max_sale,
-- find customer, reusing cached maximum size
LATERAL
(SELECT customer_name
FROM all_sales
WHERE all_sales.salesperson_id = salesperson.id
AND all_sales.amount =
-- the cached maximum size
max_sale.amount)
AS max_sale_customer;``
此查询可在 MySql 文档中找到。我尝试使用的查询是不同的,但它遵循相同的原则,我找不到任何关于如何将其转换为 JPQL 的文档。
答:
0赞
Sahab
11/9/2023
#1
请按照以下步骤操作
- 首先确定您选择的字段是什么
- 编写一个考虑所选字段的接口,例如 InterfaceGarDto
public interface InterfaceGarDto {
Long getIdGar();
LocalDate getStartDateLink();
String getToplink();
String getIdPrdeTauxRef();
LocalDate getEndDatePrde();
}
- 考虑您的实体/域编写您的 JPQL 查询
- 使用 EntityManager 从以下代码中获取预期结果
Query q = entityManager.createQuery("[ your jpql query ]");
List<InterfaceGarDto> resultList = q.getResultList();
评论
0赞
Sahab
11/9/2023
@Ems美好的一天,如果您发现难以编写JPQL查询,如果您与我共享相关的实体/域,我可以为您提供帮助
0赞
Ems
11/9/2023
嗨,萨哈卜,非常感谢!我意识到,对于我们俩来说,尝试重新创建我的特定查询的整个上下文将是相当漫长和乏味的。我已经更新了我的问题,提出了一个更通用的查询。
0赞
Sahab
11/9/2023
似乎您更新了之前的查询,这是示例 jpql SELECT s.name, max_sale.amount, max_sale_customer.customer_name FROM Salesperson s JOIN ( SELECT a.salesperson.id, MAX(a.amount) AS amount FROM AllSales a GROUP BY a.salesperson.id ) AS max_sale ON s.id = max_sale.id JOIN ( SELECT a.salesperson.id, a.customer_name FROM AllSales a WHERE a.amount = ( SELECT MAX(a.amount) FROM AllSales a WHERE a.salesperson.id = s.id ) ) AS max_sale_customer ON s.id = max_sale_customer.id
0赞
Sahab
11/9/2023
销售人员,AllSales 是您的实体,您已经编写了一个界面,考虑了您的选择字段 s.name、max_sale.amount、max_sale_customer.customer_name,并完成答案中描述的步骤
评论