You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Spring Boot JPA Data按最近日期和用户ID查询及方法声明正确性问题

Spring Data JPA 查询问题解答

嘿,我来帮你搞定这两个Spring Data JPA的问题,咱们一个个说:

一、先解决方法声明的启动错误

你写的findFirst2ByOrderByCreatedAtDescAndByUser()完全不符合Spring Data JPA的命名规则,这就是报错“anduser属性未定义”的核心原因:

  • 问题出在AndByUser这部分,Spring会把anduser当成实体类的一个属性,但你的otptable里只有user字段,自然找不到对应的属性。
  • 正确的逻辑应该是先指定查询条件(用户),再指定排序规则(按创建时间倒序),如果是要查指定用户的前2条最新记录,有两种靠谱的写法:

写法1:通过关联的User对象查询

直接传入整个Users对象作为筛选条件:

// 传入用户对象,按创建时间倒序取前2条
List<Otptable> findFirst2ByUserOrderByCreatedAtDesc(Users user);

写法2:通过用户ID直接查询

如果不想传整个对象,用用户的UUID(也就是外键userUuid对应的字段)来查更灵活:

// 通过用户ID筛选,按创建时间倒序取前2条
List<Otptable> findFirst2ByUser_IdOrderByCreatedAtDesc(String userId);

二、如何按最近日期+用户ID查询数据

根据你的需求,常见的场景有两种,我都给你列出来:

1. 查指定用户的最新1条记录

如果只需要某个用户的最新(最近日期)条目,直接用findFirst就行:

// 获取指定用户的最新一条记录
Otptable findFirstByUserOrderByCreatedAtDesc(Users user);

// 或者用用户ID查,更灵活
Otptable findFirstByUser_IdOrderByCreatedAtDesc(String userId);

2. 查指定用户的前N条最新记录

和上面的写法类似,把findFirst2里的数字换成你需要的数量就行,比如要取前5条就写findFirst5

// 替换N为具体数字,比如3、5,获取指定用户的前N条最新记录
List<Otptable> findFirstNByUser_IdOrderByCreatedAtDesc(String userId);

3. 进阶:查每个用户的最新记录(如果需要)

要是你想一次性获取所有用户各自的最新一条记录,就得用自定义SQL了,用@Query注解实现:

@Query("SELECT o FROM Otptable o WHERE o.createdAt = (SELECT MAX(o2.createdAt) FROM Otptable o2 WHERE o2.user.id = o.user.id)")
List<Otptable> findLatestRecordPerUser();

小提醒

最后给你两个小建议,避免后续踩坑:

  • 实体类名otptable建议改成Otptable(首字母大写),符合Java的命名规范,减少奇怪的问题。
  • 你实体类里的createdAt同时加了@CreationTimestamp@CreatedDate,这俩功能重复了,留一个就行(@CreationTimestamp是Hibernate的,@CreatedDate是Spring的,看你用哪个依赖)。

内容的提问来源于stack exchange,提问作者K VIMALRAJ

火山引擎 最新活动