SpringDataJpa-动态查询并且分页

本文介绍了一个基于Spring Boot的商品搜索服务实现,包括商品实体定义、Repository接口、Service接口及其实现,以及Controller层如何调用Service进行商品搜索。通过Specification模式灵活地实现了基于不同条件的查询。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.商品实体

/**
 * @Description 商品实体
 * @Author yuxiang
 * @CreatedDate 2019/10/30 12:04
 */
@Entity
@Table(name = "item")
@Data
public class ItemEntity extends BaseEntity implements Serializable {

    /**
     * 商品名称
     */
    private String itemName;

    /**
     * 价格
     */
    private Double price;

    /**
     * 商品分类
     */
    private String classNumber;
    /**
     * 商品牌子
     */
    private String brand;

    /**
     * 是否在售卖 1表示上架中 0表示已经下架
     */
    private int isSaled;

    public ItemEntity(){}

    public ItemEntity(String itemName, Double price, String classNumber, String brand, int isSaled) {
        this.itemName = itemName;
        this.price = price;
        this.classNumber = classNumber;
        this.brand = brand;
        this.isSaled = isSaled;
    }
}

2.respository

一定要实现接口JpaSpecificationExecutor

public interface ItemRepository extends JpaRepository<ItemEntity,Long> , JpaSpecificationExecutor<ItemEntity> {
}

3.service 及serviceImpl

service

/**
 * @Description 商品服务
 * @Author yuxiang
 * @CreatedDate 2019/10/30 17:31
 */
public interface ItemService {
    /**
     * 根据表单查询商品
     * @param searchForm
     * @param pageNumber
     * @param pageSize
     * @return
     */
    Page<ItemEntity> searchItemsByForm(ItemSearchForm searchForm, Integer pageNumber, Integer pageSize);
}

serviceImpl

@Service
public class ItemServiceImpl implements ItemService {

    @Autowired
    private ItemRepository itemRepository;
    
    @Override
    public Page<ItemEntity> searchItemsByForm(ItemSearchForm searchForm,Integer pageNumber,Integer pageSize){
        //Specification查询构造器
        Specification<ItemEntity> specification = new Specification<ItemEntity>() {
            @Override
            public Predicate toPredicate(Root<ItemEntity> root, CriteriaQuery<?> criteriaQuery, CriteriaBuilder criteriaBuilder) {
                List<Predicate> predicates = new ArrayList<>();
                //添加搜素条件
                if (StringUtils.isNotEmpty(searchForm.getClassName())&&StringUtils.isNotBlank(searchForm.getClassName())){
                    //分类用equal
                    predicates.add(criteriaBuilder.equal(root.get("className"),searchForm.getClassName()));
                }
                if (StringUtils.isNotEmpty(searchForm.getBrand())&&StringUtils.isNotBlank(searchForm.getBrand())){
                    predicates.add(criteriaBuilder.like(root.get("brand"),"%"+searchForm.getBrand()+"%"));
                }
                if (StringUtils.isNotEmpty(searchForm.getItemNumber())&&StringUtils.isNotBlank(searchForm.getItemNumber())){
                    predicates.add(criteriaBuilder.like(root.get("id"),"%"+searchForm.getItemNumber()+"%"));
                }
                if (StringUtils.isNotEmpty(searchForm.getItemName())&&StringUtils.isNotBlank(searchForm.getItemName())){
                    predicates.add(criteriaBuilder.like(root.get("itemName"),"%"+searchForm.getItemName()+"%"));
                }
                //把搜索条件用and连接起来
                return criteriaBuilder.and(predicates.toArray(new Predicate[predicates.size()]));
            }
        };
        Pageable pageable = PageRequest.of(pageNumber,pageSize, Sort.Direction.DESC,"updateTime");//new PageRequest(page,size,Sort)已过时,这是官方推荐的方法
        return itemRepository.findAll(specification,pageable);

    }
}

在Contoller中使用

@PostMapping("/searchItem")
    public  List<ItemEntity> searchItem(@RequestBody ItemSearchForm searchForm,
                                  @RequestParam(value = "pageNumber",defaultValue = "1")Integer pageNumber,
                                  @RequestParam(value = "pageSize",defaultValue = "10")Integer pageSize){
        ApiResponse response;
        Page<ItemEntity> page = itemService.searchItemsByForm(searchForm, pageNumber, pageSize);
        //返回商品列表
        return page.getContent();
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值