如何将包含横向派生表的SQL查询转换为JPQL?

How to convert an SQL query which contains a lateral derived table to JPQL?

提问人:Ems 提问时间:11/9/2023 最后编辑:Ems 更新时间:11/9/2023 访问量:33

问:

我正在尝试将以下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 的文档。

java sql spring-data-jpa spring-data 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,并完成答案中描述的步骤