JpaSpecificationExecutor<T> 接口 :
1.不属于Repository体系,实现一组 JPA Criteria 查询相关的方法 。
2.Specification:封装 JPA Criteria 查询条件。通常使用匿名内部类的方式来创建该接口的对象。
nativeQuery:是否开启本地查询,默认false
package com.java1234.dao;
import java.util.List;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import org.springframework.data.jpa.repository.Query;
import com.java1234.Books;
public interface Bookdao extends JpaRepository<Books, Integer>,JpaSpecificationExecutor<Books> {
@Query("select b from Books b where b.name like %?1% ")
public List<Books> findByname(String name);
/*本地查询*/
@Query(value="select * from book order by RAND() limit ?1",nativeQuery=true)
public List<Books> randomList(Integer n);
}
CriteriaBuilder是一个工厂对象
@RequestMapping("/list1")
public ModelAndView list1(Books book) {
ModelAndView mav = new ModelAndView();
System.out.println("book::"+book.getName());
mav.addObject("bookslist", bookdao.findAll(new Specification<Books>() {
@Override
public Predicate toPredicate(Root<Books> arg0, CriteriaQuery<?> arg1, CriteriaBuilder cd) {
Predicate predicate=cd.conjunction();
if(book!=null) {
if(book.getName()!=null&&!"".equals(book.getName())) {
predicate.getExpressions().add(cd.like(arg0.get("name"),"%"+book.getName()+"%"));
}
if(book.getAuthor()!=null&&!"".equals(book.getAuthor())) {
predicate.getExpressions().add(cd.like(arg0.get("author"),"%"+book.getAuthor()+"%"));
}
}
return predicate;
}
}));
mav.setViewName("booklist");
return mav;
}