本节主要说明SpringData 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全称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);
}