springboot+springJPA+thmleaf按条件分页查询

 

做一个搜索商品名称的分页查询,我是小菜鸟,

写的不对的地方,欢迎路过大神指教

maven中POM.xml引入

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>


数据库:

  CREATE TABLE `product` (
    `product_id` int(11) NOT NULL AUTO_INCREMENT,
    `product_name` varchar(255) DEFAULT NULL,
    `product_size` varchar(255) DEFAULT NULL,
    `product_price` double DEFAULT NULL,
    `product_picture` varchar(255) DEFAULT NULL,
    PRIMARY KEY (`product_id`)
  )

 

实体类:

  @Entity //实体类对象注解
  @Table(name="product") 表
  public class Product {
    @Id 主键
    @GeneratedValue 自增
    private Integer product_id;
    @Column(name="product_name")
    private String product_name;
    @Column(name="product_size")
    private String product_size;
    @Column(name="product_price")
    private double product_price;
    @Column(name="product_picture")
    private String product_picture;
    

  此处省略set,get方法
  }

DAO:
注意包:
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;

  @Repository
  public interface Productdao extends JpaRepository<Product, Integer>,JpaSpecificationExecutor<Product> {

注意:
JpaSpecificationExecutor 接口具有方法

Page<T> findAll(Specification<T> spec, Pageable pageable); //分页按条件查询

List<T> findAll(Specification<T> spec); //不分页按条件查询

 

Sevice:

只是分页查询的一个方法

@Autowired
private Productdao productdao;

public Page<Product> findAll(Product product, PageRequest pageRequest) {
  Page<Product> page = null;
  如果product的name属性为空
    if (product == null) {
       仅仅是分页,调用此方法
      page = productdao.findAll(pageRequest);
    } else {
     
        Specification<Product> specification = new Specification<Product>() {
        
          Root:查询哪个表
          CriteriaQuery:查询哪些字段,排序是什么
          CriteriaBuilder:字段之间是什么关系,如何生成一个查询条件,每一个查询条件都是什么方式
          Predicate(Expression):单独每一条查询条件的详细描述
       @Override 

       public Predicate toPredicate(Root<Product> root, CriteriaQuery<?> query, CriteriaBuilder cb) {
          List<Predicate> predicates = new ArrayList<>();
            if (product.getProduct_name()!= null) {
              predicates.add(cb.like(root.get("product_name").as(String.class), "%" + product.getProduct_name().trim() + "%"));
             }

            if (predicates.size() > 0) {
              Predicate[] predicateArr = new Predicate[predicates.size()];
              return query.where(predicates.toArray(predicateArr)).getRestriction();
            }
          这种方式使用JPA的API设置了查询条件,所以不需要再返回查询条件Predicate给Spring Data Jpa,故最后return null;即可
          return null;
            }
          };
          page =productdao.findAll(specification, pageRequest);
        }
      return page;
      }


Controller/*分页展示商品*/
    @RequestMapping(value="/showproduct")
    public String toProductList(Product product,
                @RequestParam(value = "page", defaultValue = "0") Integer page,
                @RequestParam(value = "size", defaultValue = "5") Integer size,
                Model model) {

      Page<Product> productPage =productbiz.findAll(product,new PageRequest(page, size));
      model.addAttribute("page",page);
      model.addAttribute("productPage", productPage );
      model.addAttribute("product", product);
      return "goods/goods/showproduct" ;
    }

thymleaf前端页面:

引入thymleaf
    <html xmlns="http://www.w3.org/1999/xhtml"
       xmlns:th="http://www.thymeleaf.org"
        xmlns:sec="http://www.thymeleaf.org/thymeleaf-extras-springsecurity3">

  搜索框和分页不展示了,用了别人的框架,拷过去也不能用

<table >
<thead>
<tr>
<th >商品ID</th>
<th >商品名称</th>
<th >商品尺寸</th>
<th >商品价格</th>
<th >商品图片</th>
</tr>
</thead>
<tbody>
<tr th:each="product,memberStat:${articlePage}">
<td th:text="${product.product_id}"></td>
<td th:text="${product.product_name}"></td>
<td th:text="${product.product_size}"></td>
<td th:text="${product.product_price}"></td>
<td th:text="${product.product_picture}"></td>
</tr>
</tbody>
</table>

猜你喜欢

转载自www.cnblogs.com/lr12339/p/9300232.html