SpringBoot 2.2.0 SpringData JPA使用示例(二)

本节主要说明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支持的关键字以及包含该关键字的方法所转换的含义
SpringBoot 2.2.0 SpringData JPA使用示例(二)_第1张图片

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);
    }

你可能感兴趣的:(SpringData)