jpa 如何从数据库中检索最年轻的两个用户(最多两个给定的限制日期)

m4pnthwp  于 2023-02-04  发布在  其他
关注(0)|答案(1)|浏览(118)

让我们假设下面的持久性对象...

@Getter
@Setter
@Entity
public class UserPo {

    @Id
    private Long id;

    private String name;

    private LocalTime birthDate;
}

...和以下存储库:

public interface UserRepository extends JpaRepository<UserPo, Long> {

  Optional<UserPo> findDistinctTopByOrderByBirthDateDesc(final LocalDate limitDate);
}

findDistinctTopByOrderByBirthDateDesc返回到指定日期为止最年轻的用户。
现在假设有以下8个用户:

---------------------------------------
ID | NAME     | BIRTH_DATE (YYYY-MM-DD)
---------------------------------------
 1 | Joe      | 1980-10-25
 2 | John     | 1951-11-30 <===
 3 | Matthew  | 1988-09-27
 4 | Paul     | 1946-02-28
 5 | Erik     | 1987-07-11
 6 | Michael  | 1996-03-03
 7 | David    | 1990-08-15
 8 | Steven   | 2000-11-01 <===

我需要一个查询,给定2个日期,返回到这2个日期为止最年轻的用户。例如,查询输入是limitDate1limitDate2,假设limitDate12023-01-01LimitDate21952-01-01,查询将返回用户8和用户2。
任何帮助都将不胜感激。

dgtucam1

dgtucam11#

我想这是不可能的。为什么不使用两个不同的参数执行两次这个查询呢?顺便说一句,也许窗口函数会有帮助,但我几乎不能说这种方法会更有效。

WITH cte AS (
  SELECT id, name, birthDate,
         ROW_NUMBER() OVER (ORDER BY birthDate DESC) AS rn
  FROM UserPo
)
SELECT 
  (SELECT name FROM cte WHERE birthDate <= :limitDate1 AND rn = 1) AS youngest1,
  (SELECT name FROM cte WHERE birthDate <= :limitDate2 AND rn = 1) AS youngest2
FROM DUAL;

该方法的签名将类似于以下内容:

Object[] findYoungestUsers(@Param("limitDate1") LocalDate limitDate1, @Param("limitDate2") LocalDate limitDate2);

相关问题