按自定义字段搜索 JPA 存储库

JPA Repository search by custom field

我正在尝试获取具有相同字段的对象列表。

我有一个名为 Song 的模型,其中包含以下字段:名称、流派、艺术家和 ID。

我在网上阅读了有关如何在存储库中实现该方法的信息,并像这样添加了它:

@Repository public interface ISongRepository extends JpaRepository<Song, Long>{

    @Query("SELECT s.name FROM Song s WHERE s.genre = ?1")
    Song findByGenre(String genre); 
}

现在我想使用我在控制器中创建的端点检索对象。但是我在网上找不到我需要如何正确编写这个方法。

我尝试使用与通过 ID 获取相同的格式,但这不起作用,自定义方法是否有不同的格式?

我通过id获取的代码:

@GetMapping(value = "/{id}")
@ResponseBody
public ResponseEntity getSongById(@PathVariable("id") Long id) {
    Optional<Song> song = songRepository.findById(id);

    if(song.isEmpty()) {
      return ResponseEntity.badRequest().body(song);
    }
    return ResponseEntity.ok(song.get());
}

我检索自定义方法输出的方法代码:

@GetMapping(value = "/genre/{genre}")
    @ResponseBody
    public ResponseEntity getSongByGenre(@PathVariable("genre") String songGenre){
        List<Song> song = song.(songRepository.findByGenre(songGenre));

        if(song.isEmpty()){
            return ResponseEntity.badRequest().body(song);
        }
        return ResponseEntity.ok(song.get());
    }
}

尝试在 ISongRepository 添加 @Param 并将 return 类型 findByGenre 方法更改为 List<Song>

,还要确保从其余控制器

中检索 idgenre
@Repository public interface ISongRepository extends JpaRepository<Song, Long>{

    @Query("SELECT s FROM Song s WHERE s.genre =:genre")
    List<Song> findByGenre(@Param("genre") String genre); 
}

我在控制器中将方法更改为:

 @GetMapping("/genre/{genre}")
 public ResponseEntity getAllSongsGenre(@PathVariable("genre") String genre){
         List<Song> song;
         if(genre != null){
             song = songRepository.findByGenre(genre);
             if(song.isEmpty()){
                 return ResponseEntity.badRequest().body(song);
             }
             return ResponseEntity.ok(song);
         }
         song = songRepository.findAll();
 
         return ResponseEntity.ok(song);
     }

并且在 JPARepository 中是这样的:

 List<Song> findByGenre(String genre);

输出是这样的(在 Postman 中):

{
    "songName": "Someday",
    "songArtist": "Kygo",
    "songGenre": "House",
    "songId": 1
}