JPA Repository按自定义字段查询时Controller接口实现问题
Spring Data JPA 按genre查询功能实现方案
1 修复Repository层错误
你当前的Repository存在两个核心问题:
- JPQL语句
SELECT s.name仅返回歌曲名称字段,和方法声明的返回值Song类型不匹配 - 同一流派可能对应多首歌曲,返回值应该为
List<Song>而非单个Song对象
最简实现(无需手动写JPQL,利用Spring Data JPA派生查询规则)
@Repository public interface ISongRepository extends JpaRepository<Song, Long>{ // 直接按方法名自动生成查询逻辑,返回对应流派的所有歌曲 List<Song> findByGenre(String genre); }
若需要自定义JPQL的正确写法
@Repository public interface ISongRepository extends JpaRepository<Song, Long>{ // SELECT s 表示返回完整的Song实体对象 @Query("SELECT s FROM Song s WHERE s.genre = ?1") List<Song> findByGenre(String genre); }
2 修复Controller层错误
你当前的Controller存在语法错误和返回值处理错误:
- 调用Repository的语法错误,不存在
song.(xxx)的写法 List类型没有get()方法,无需调用该方法直接返回集合即可
正确的接口实现代码
@GetMapping(value = "/genre/{genre}") @ResponseBody public ResponseEntity getSongByGenre(@PathVariable("genre") String songGenre){ List<Song> songList = songRepository.findByGenre(songGenre); if(songList.isEmpty()){ return ResponseEntity.badRequest().body("未查询到对应流派的歌曲"); } return ResponseEntity.ok(songList); }
补充说明
自定义查询方法和JPA内置的findById等方法调用规则完全一致,没有特殊要求,仅需要保证方法返回值和接收的变量类型匹配即可。
内容的提问来源于stack exchange,提问作者Luca
相关产品推荐
相关产品推荐

