Spring Data JPA所提供的通过方法名进行查询的功能已经能够覆盖绝大多数单表查询了。但是现实场景总是比想象的要复杂,有时候我们可能依然希望能够通过SQL语句来进行查询。Spring Data JPA中可以使用@Query
标注来自定义SQL查询。
使用@Query
标注一般在两种情况下需要用到:
涉及到复杂的多表联合查询
复杂的查询条件,比如查询条件中可能有括号来组合条件,这时通过方法命名可能无法表达;即Spring Data JPA的命名和解析规则并不能表达所有查询条件
比如希望通过一个Tag的名字找到包含该Tag的所有博客,可以通过@Query
标注来实现:
public interface BlogRepository extends PagingAndSortingRepository<Blog, Integer> {
@Query("select b from Blog b join b.tags t where t.name = ?1")
Page<Blog> findByTag(String tag, Pageable pageable);
}
在BlogRepository
中,我们通过@Query标注使用了HQL进行查询,其中?1
表示第一个查询参数,对应方法签名中的tag
参数。
也可以使用原生的SQL进行查询,只需增加在@Query
标注中增加nativeQuery = true
的设置。
我们来写一个Controller展示我们的查询结果:
@RestController
public class TestController {
@Autowired BlogRepository blogRepository;
@RequestMapping(value = "", method=RequestMethod.GET)
public Page<Blog> getEntryByPageable(@PageableDefault(value = 15, sort = { "id" }, direction = Sort.Direction.DESC)
Pageable pageable, @RequestParam(value = "tag", defaultValue = "") String tag) {
if("".equals(tag)){
return blogRepository.findAll(pageable);
}
return blogRepository.findByTag(tag, pageable);
}
}
登录发表评论 登录 注册