【问题标题】:I want to convert sql query into Spring Data JPA based query我想将 sql 查询转换为基于 Spring Data JPA 的查询
【发布时间】:2016-12-31 10:10:51
【问题描述】:

鉴于我的 SQL 查询如下:

SELECT
  maker_code
FROM
  maker
WHERE
  part_no = p_part_no
AND effect_date_in <= TODAY
AND effect_date_out > TODAY 
AND effect_date_in = (SELECT MAX(effect_date_in) FROM maker WHERE part_no =p_part_no)

我想将 Spring Data JPA 与 findBy---() 等内置方法一起使用,这将返回与上述 sql 查询相同的结果

我试过 JPQL 查询:

 @Query(value = "
    SELECT p FROM Pg6p0012_01PurpartQueryModel p where p.partNo = :p_part_no AND 
    p.effectDateIn <= TODAY AND p.effectDateOut > TODAY AND p.effectDateIn = 
    (
    select max(p.effectDateIn)from Pg6p0012_01PurpartQueryModel where partNo =:p_part_no)"
    )

public List<Pg6p0012_01PurpartQueryModel>findByPartNo(@Param("p_part_no") String p_part_no);

但我收到一个错误: 在这种情况下对聚合的使用不当。

【问题讨论】:

  • 问题出在哪里?您对 JPQL 的哪一部分有疑问?你试过什么?你的错误在哪里?
  • @Neil Stockton 我已经编辑了问题
  • JPA API 没有像“findBy...”这样的“内置函数”。如果您没有意识到这一点,请阅读 JPA 规范。您大概指的是 SPRING DATA JPA ...不是 JPA API。了解您首先使用什么技术
  • 没错,我正在使用 SPRING DATA JPA。有没有办法使用 SPRING DATA JPA 内置函数来实现上述结果。
  • 即使有办法,您最终也会得到一个 250 个字符长的方法名称,而您真的不希望这样。从方法名称自动生成查询对于像 findByName() 这样的简单查询很好。它们不好,也不打算用于复杂的查询。使用任何方法名称,并使用 @Query 对其进行注释,您将在其中定义标准 JPQL 查询。

标签: java spring spring-data-jpa


【解决方案1】:

您无法从嵌套查询中访问别名 p 以获取像 MAX 这样的聚合函数。嵌套查询必须有自己的表别名。比如:

 @Query(value = "
    SELECT p FROM Pg6p0012_01PurpartQueryModel p where p.partNo = :p_part_no AND 
    p.effectDateIn <= TODAY AND p.effectDateOut > TODAY AND p.effectDateIn = 
    (SELECT MAX(p2.effectDateIn) FROM Pg6p0012_01PurpartQueryModel p2 WHERE partNo =:p_part_no)"
 )

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-06-08
    • 2022-01-17
    • 2020-01-11
    • 2014-08-04
    • 1970-01-01
    • 2019-03-02
    • 1970-01-01
    • 2021-11-22
    相关资源
    最近更新 更多