如何在Spring Boot的JPA Repository中编写自定义SQL查询?
按姓名查询用户的自定义查询实现方案
在Spring Boot结合JPA的场景下,实现按姓名查询用户的自定义查询,有两种常用的落地方式,具体实现如下:
方式一:JPA自动推导的命名查询
JPA支持根据方法名自动生成SQL语句,无需手动编写查询逻辑,只需在你的CommentRepository中添加对应方法即可:
public interface CommentRepository extends JpaRepository<User, Long> { // 精确匹配姓名(对应实体类的name属性,映射数据库first_name字段) List<User> findByName(String name); // 模糊匹配姓名(包含指定关键词) List<User> findByNameContaining(String name); }
接着在控制器中新增对应的接口,接收姓名参数并调用查询方法:
@RestController @RequestMapping(path="/api/v1/users") public class CommentController { @Autowired CommentRepository repository ; @GetMapping(path="/list") public List<User> users() { return repository.findAll(); } // 新增:按姓名精确查询 @GetMapping("/by-name") public List<User> getUsersByName(@RequestParam String name) { return repository.findByName(name); } // 可选:按姓名模糊查询 @GetMapping("/by-name-like") public List<User> getUsersByNameLike(@RequestParam String keyword) { return repository.findByNameContaining(keyword); } }
方式二:自定义JPQL/原生SQL查询
如果需要更灵活的查询逻辑,可以使用@Query注解手动编写查询语句:
基于JPQL的查询(面向实体类)
public interface CommentRepository extends JpaRepository<User, Long> { @Query("SELECT u FROM User u WHERE u.name = :userName") List<User> findByUserName(@Param("userName") String name); }
基于原生SQL的查询(直接操作数据库表)
public interface CommentRepository extends JpaRepository<User, Long> { @Query(value = "SELECT * FROM users WHERE first_name = :userName", nativeQuery = true) List<User> findByUserNameNative(@Param("userName") String name); }
对应的控制器接口写法和方式一一致,只需调用对应的repository方法即可。
内容的提问来源于stack exchange,提问作者Kirion
相关产品推荐
相关产品推荐

