按自定义字段搜索 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>
,还要确保从其余控制器
中检索 id
或 genre
@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
}
我正在尝试获取具有相同字段的对象列表。
我有一个名为 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>
,还要确保从其余控制器
中检索id
或 genre
@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
}