• jpa多条件查询


    首先继承JpaSpecificationExecutor<T>接口

    需要用到JpaSpecificationExecutor<T>中的Page<T> findAll(@Nullable Specification<T> spec, Pageable pageable);//多条件分页查询

    ITpSamplerInfoService.java

    Page<TpSamplerInfo> findByConditionPage(Long samplerCode,String crossName,Pageable pageable);
    

    TpSamplerInfoServiceImpl.java实现类

    @Autowired
    ITpSamplerInfoDao samplerInfoDao;//继承JpaSpecificationExecutor<T>


    @Override public Page<TpSamplerInfo> findByConditionPage(Long samplerCode,String crossName, Pageable pageable) { Page<TpSamplerInfo> pageList = samplerInfoDao.findAll(new Specification<TpSamplerInfo>() { @Override public Predicate toPredicate(Root<TpSamplerInfo> root, CriteriaQuery<?> query, CriteriaBuilder criteriaBuilder) { List<Predicate> list = new ArrayList<Predicate>(); if(samplerCode!=null) { list.add(criteriaBuilder.like(root.get("samplerCode"), "%"+samplerCode+"%")); } if(crossName!=null) { //外键对象的属性,要用join再get list.add(criteriaBuilder.like(root.join("tpCrossroadInfo").get("crssroadName"), crossName)); } Predicate[] array = new Predicate[list.size()]; return criteriaBuilder.and(list.toArray(array)); } },pageable); return pageList; }
    //例子2,查询时间段内的记录
    @Override
    	public Page<MapPack> findAll(Integer code, String startData, String endData, Pageable pageable) {
    		Page<MapPack> pageList = getMapPackDao().findAll(new Specification<MapPack>() {
    			
    			@Override
    			public Predicate toPredicate(Root<MapPack> root, CriteriaQuery<?> query, CriteriaBuilder cb) {
    				List<Predicate> list = new ArrayList<Predicate>();
    				
    				SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
    				SimpleDateFormat sdfmat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    				
    				if (StringUtils.isNotEmpty(startData) && StringUtils.isNotEmpty(endData)) {
    			        try {
    						list.add(cb.between(root.get("registerTime"),
    								sdfmat.parse(sdfmat.format(sdf.parse(startData).getTime())),
    	                            sdfmat.parse(sdfmat.format(sdf.parse(endData).getTime() + 86400000))));
    					} catch (ParseException e) {
    						e.printStackTrace();
    					}
    			    }
    				if(code!=-1) {
    					list.add(cb.equal(root.join("city").get("id").as(String.class), code));
    				}
    				Predicate[] array = new Predicate[list.size()];
                    return cb.and(list.toArray(array));
    			}
    		}, pageable);
    		return pageList;
    	}
    

      

      

     controller

    @RequestMapping("/getAllSamplerInfo")
        public Map<String,Object> findByConditionPage(@RequestParam("pageNumber") int page,@RequestParam("pageSize") int size,
                @RequestParam("samplerCode") Long samplerCode,@RequestParam("crossName") String crossName){
            Map<String,Object> map = new HashMap<String, Object>();
            Pageable pageable = PageRequest.of(page-1, size, Direction.DESC, "id");
            Page<TpSamplerInfo> pageList = tpSamplerInfoService.findByConditionPage(samplerCode,crossName, pageable);
            //使用值对象Vo包装一下实体类,解决递归问题
            List<TpSamplerInfoVo> list = new ArrayList<>();
            pageList.forEach(pl->{
                TpSamplerInfoVo tpVo = new TpSamplerInfoVo(pl);
                list.add(tpVo);
            });
            map.put("rows", list);
            map.put("total", pageList.getTotalElements());
            
            return map;
            
        }

     注意:在多条件查询时候查询id主键的时候遇到过一个错误

    Parameter value [%3%] did not match expected type [java.lang.Long (n/a)]      意思是参数不匹配预期类型,id是Long类型

    解决办法:list.add(criteriaBuilder.like(root.get("id").as(String.class), "%"+crossId+"%"));

    加上as(String.class)就不会出现类型不匹配的问题

     

  • 相关阅读:
    图的存储结构(精编)
    二叉树的输入
    哈夫曼树及编码
    C. Bits (Codeforces Round #276 (Div. 2) )
    C++ Map 容器
    POJ 1080 Human Gene Functions(dp)
    数和二叉树——二叉树的建立及应用(遍历等)(基础篇)
    数独问题的介绍及POJ 2676-Sudoku(dfs+剪枝)
    【数据结构】——稀疏矩阵转置
    POJ 3083 Children of the Candy Corn
  • 原文地址:https://www.cnblogs.com/yunqing/p/9145745.html
Copyright © 2020-2023  润新知