接上篇https://blog.youkuaiyun.com/true100/article/details/103181562,写个简单的jpa条件查询示例,就算是多凑篇博客吧,好久没写了,惭愧!
接口JpaRepository只有以下几个方法供我们使用,很多时候不能满足我们按照条件查询的要求。
public interface JpaRepository<T, ID> extends PagingAndSortingRepository<T, ID>, QueryByExampleExecutor<T> {
List<T> findAll();
List<T> findAll(Sort var1);
List<T> findAllById(Iterable<ID> var1);
<S extends T> List<S> saveAll(Iterable<S> var1);
void flush();
<S extends T> S saveAndFlush(S var1);
void deleteInBatch(Iterable<T> var1);
void deleteAllInBatch();
T getOne(ID var1);
<S extends T> List<S> findAll(Example<S> var1);
<S extends T> List<S> findAll(Example<S> var1, Sort var2);
}
不过另外还有个接口JpaSpecificationExecutor,这个就为我们指定条件查询提供了相应api
public interface JpaSpecificationExecutor<T> {
Optional<T> findOne(@Nullable Specification<T> var1);
List<T> findAll(@Nullable Specification<T> var1);
Page<T> findAll(@Nullable Specification<T> var1, Pageable var2);
List<T> findAll(@Nullable Specification<T> var1, Sort var2);
long count(@Nullable Specification<T> var1);
}
比如我们要根据书的作者加文章来查询对应的信息,就可以这样做。
- 首先,让我们实现JpaSpecificationExecutor接口:
public interface BookRepository extends JpaRepository<Book, Long>, JpaSpecificationExecutor {
}
2.编写查询方法(代码写在BookController类中):
@PostMapping("/queryByAuthor")
private List<Book> queryBooksByAuthor(@RequestBody BookParams2 bookParams2) {
Specification<Book> specification = new Specification<Book>() {
@Override
public Predicate toPredicate(Root<Book> root, CriteriaQuery<?> criteriaQuery, CriteriaBuilder criteriaBuilder) {
List<Predicate> predicates = new ArrayList<>();
//判断作者
if (bookParams2.getAuthor() != null) {
predicates.add(criteriaBuilder.equal(root.get("author"), bookParams2.getAuthor()));
}
//判断书名,用的是Lile模糊匹配
if (bookParams2.getBookName() != null) {
predicates.add(criteriaBuilder.like(root.get("bookName"), "%" + bookParams2.getBookName() + "%"));
}
return criteriaBuilder.and(predicates.toArray(new Predicate[predicates.size()]));
}
};
return bookRepository.findAll(specification);
}
3.传入的参数类:
import lombok.Data;
@Data
public class BookParams2 {
private String author;
private String bookName;
public String getBookName() {
return bookName;
}
public void setBookName(String bookName) {
this.bookName = bookName;
}
public String getAuthor() {
return author;
}
public void setAuthor(String author) {
this.author = author;
}
}
4.postman测试:
更多的方法还在摸索中…