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




