获取指定ASMS编号下最高ID最新记录的SQL与前后端实现问题
解决方案:获取指定ASMS编号的最新记录(ID最大)
后端Java(Spring Data JPA)方案
方法1:优化派生查询(Derived Query)
之前的findFirst1ByAsmsNumber未指定排序规则,只会返回数据库中匹配的第一条记录,而非ID最大的最新记录。只需在方法名中补充排序逻辑即可:
- 在
PriorityProgressRepository接口中定义正确的查询方法:
// 按ID降序排序,取第一条匹配ASMS编号的记录 Optional<PriorityProgressEntity> findFirstByAsmsNumberOrderByIdDesc(String asmsNumber);
- 修改Controller方法,调整返回类型为单个
Optional(无需返回列表):
//RETURN ONLY THE LATEST RECORD //https://besterdev-api.apps.pcfepg3mi.gm.com/api/v1/pprecords/latest/{asmsnumber} @RequestMapping("/pprecords/latest/{asmsNumber}") public Optional<PriorityProgressEntity> getLatestRecord(@PathVariable(value = "asmsNumber") String asmsNumber) { return priorityprogressrepo.findFirstByAsmsNumberOrderByIdDesc(asmsNumber); }
方法2:自定义JPQL查询
如果派生查询不够灵活,可直接编写JPQL语句控制逻辑:
// 在PriorityProgressRepository接口中添加 @Query("SELECT p FROM PriorityProgressEntity p WHERE p.asmsNumber = :asmsNumber ORDER BY p.id DESC LIMIT 1") Optional<PriorityProgressEntity> findLatestByAsmsNumber(@Param("asmsNumber") String asmsNumber);
之后Controller调用该方法即可,返回类型同样调整为Optional<PriorityProgressEntity>。
前端React(Axios)方案
若暂时无法修改后端,可在前端拿到所有匹配记录后,筛选出ID最大的对象:
axios.get(`/api/v1/pprecords/latest/${asmsNumber}`) .then(response => { const records = response.data; if (!records || records.length === 0) { // 处理无数据的情况 return; } // 遍历数组,找到ID最大的记录 const latestRecord = records.reduce((prev, current) => { return prev.id > current.id ? prev : current; }); // 使用latestRecord渲染UI console.log('最新记录:', latestRecord); }) .catch(error => { console.error('获取数据失败:', error); });
内容的提问来源于stack exchange,提问作者Bester
相关产品推荐
相关产品推荐

