SpringBoot 2.2.0 SpringData JPA使用示例(二)

mac2025-08-02  2

本节主要说明SpringData JPA的常用查询操作

根据jpa接口实现的查询方式查询

根据主键查询 @Test public void findAllByIdTest() { Optional<Article> article = articleRepository.findById(21); System.out.println(article); } 根据主键查询多个 @Test public void findAllByIdsTest() { List<Integer> ids = new ArrayList<>(); ids.add(20); ids.add(21); ids.add(23); List<Article> articles = articleRepository.findAllById(ids); for (Article article : articles) { System.out.println(article); } } 查询所有 @Test public void findAllTest() { List<Article> articles = articleRepository.findAll(); System.out.println(articles); } 查询所有并排序 @Test public void findAllWithSortTest() { Sort asc = Sort.by(Sort.Order.asc("id")); Sort desc = Sort.by(Sort.Order.desc("id")); List<Article> articles = articleRepository.findAll(asc); for (Article article : articles) { System.out.println(article); } } 查询所有并分页 @Test public void findAllWithPageTest() { Pageable pageable = PageRequest.of(0, 5); Page<Article> pages = articleRepository.findAll(pageable); System.out.println("总页数" + pages.getTotalPages()); System.out.println("总记录数" + pages.getTotalElements()); System.out.println("每页多少" + pages.getSize()); System.out.println("排序方式" + pages.getSort()); System.out.println("当前页" + pages.getNumber()); System.out.println("是否有内容" + pages.hasContent()); System.out.println("是否有上一页" + pages.hasPrevious()); System.out.println("是否有下一页" + pages.hasNext()); List<Article> articles = pages.getContent(); for (Article article : articles) { System.out.println(article); } } 查询所有并分页并排序 @Test public void findAllWithPageTest() { Sort asc = Sort.by(Sort.Order.asc("id")); Sort desc = Sort.by(Sort.Order.desc("id")); Pageable pageable = PageRequest.of(0, 5,desc); Page<Article> pages = articleRepository.findAll(pageable); System.out.println("总页数" + pages.getTotalPages()); System.out.println("总记录数" + pages.getTotalElements()); System.out.println("每页多少" + pages.getSize()); System.out.println("排序方式" + pages.getSort()); System.out.println("当前页" + pages.getNumber()); System.out.println("是否有内容" + pages.hasContent()); System.out.println("是否有上一页" + pages.hasPrevious()); System.out.println("是否有下一页" + pages.hasNext()); List<Article> articles = pages.getContent(); for (Article article : articles) { System.out.println(article); } }

根据方法命名查询

主要就是根据方法的名称进行查询,只要按照SpringData JPA提供的方法命名规则定义方法名称,即可完成查询。

public interface ArticleRepository extends JpaRepository<Article, Integer>, JpaSpecificationExecutor<Article> { /** * 根据标题 查询 * * @param title 标题 * @return Article列表 */ List<Article> findByTitle(String title); /** * 根据标题模糊查询 * * @param title 标题 * @return Article列表 */ List<Article> findByTitleLike(String title); /** * 根据ID范围查询 * * @param sid 开始Id * @param endid 结束id * @return Article列表 */ List<Article> findByIdBetween(Integer sid, Integer endid); /** * 在创建时间之后 * * @param createTime 创建时间 * @return Article列表 */ List<Article> findByCreateDateTimeAfter(LocalDateTime createTime); /** * 在创建时间之前 * * @param createTime 创建时间 * @return Article列表 */ List<Article> findByCreateDateTimeBefore(LocalDateTime createTime); } @Test public void findArticleTest() { //根据 标题查询 List<Article> articles = articleRepository.findByTitle("Spring"); for (Article article : articles) { System.out.println(article); } //根据标题模糊查询 List<Article> articles1 = articleRepository.findByTitleLike("Spring"); for (Article article : articles1) { System.out.println(article); } //在id范围类查询 List<Article> articles2 = articleRepository.findByIdBetween(20, 21); for (Article article : articles2) { System.out.println(article); } //查询在创建时间之后 List<Article> articles3 = articleRepository.findByCreateDateTimeAfter(LocalDateTime.now()); for (Article article : articles3) { System.out.println(article); } //查询在创建时间之前 List<Article> articles4 = articleRepository.findByCreateDateTimeBefore(LocalDateTime.now()); for (Article article : articles4) { System.out.println(article); } }

下表描述了JPA支持的关键字以及包含该关键字的方法所转换的含义

JPQL查询

JPQL全称Java Persistence Query Language 基于首次在EJB2.0中引入的EJB查询语言(EJB QL),Java持久化查询语言(JPQL)是一种可移植的查询语言,旨在以面向对象表达式语言的表达式,将SQL语法和简单查询语义绑定在一起·使用这种语言编写的查询是可移植的,可以被编译成所有主流数据库服务器上的SQL。 其特征与原生SQL语句类似,并且完全面向对象,通过类名和属性访问,而不是表名和表的属性。

/** * 根据ID查询 * * @param id ID * @return Article */ @Query("from Article where id=:id") Article findArticle(@Param("id") Integer id); /** * 根据标题模糊查询 * * @param title 标题 * @return Article列表 */ @Query("from Article where title like %:title%") List<Article> findLikeArticle(@Param("title") String title); /** * 根据标题模糊查询并排序 * * @param title 标题 * @return Article列表 */ @Query("from Article where title like %:title% order by id asc ") List<Article> findLikeArticleSort(@Param("title") String title); /** * 根据标题模糊查询并排序 和分页 * * @param title 标题 * @return Article列表 */ @Query("from Article where title like %:title%") List<Article> findLikeArticleSortAndPage(Pageable pageable, @Param("title") String title); @Test public void jpqlTest() { //根据ID查询 Article article = articleRepository.findArticle(20); System.out.println(article); //模糊查询 List<Article> articles = articleRepository.findLikeArticle("spring"); for (Article article1 : articles) { System.out.println(article1); } //模糊查询并排序 List<Article> articles5 = articleRepository.findLikeArticleSort("spring"); for (Article article4 : articles5) { System.out.println(article4); } //查询并分页和排序 Sort asc = Sort.by(Sort.Order.asc("id")); Sort desc = Sort.by(Sort.Order.desc("id")); Pageable pageable = PageRequest.of(0, 5, desc); List<Article> articles2 = articleRepository.findLikeArticleSortAndPage(pageable, "Spring"); for (Article article3 : articles2) { System.out.println(article3); } }

本地查询

该@Query注释允许通过设定运行的原生查询nativeQuery标志设置为true,如下示例:

@Query(value = "select * from article where id=:id", nativeQuery = true) Article findNativeQuery(@Param("id") Integer id); @Test public void findNativeQueryTest(){ Article article = articleRepository.findNativeQuery(20); System.out.println(article); }
最新回复(0)