SpingBoot-JPA复杂查询,动态查询

carpark与shareInfo为一对多关系,筛选条件为shareInfo内部的startTime ,endTime ,unitprice,shareDay
为了实现carpark属性里面可以存在shareInfo对象(本身carpark有一个shareInfo的list属性,但符合界面显示,又新建了DTO对象,Entity会将特定值赋值给DTO,如下图),又符合过滤条件,并且将前端不需要的值过滤出来,写如下代码:

Dao层

public List getAroundCarparkInReservation() {
        CriteriaBuilder cb = em.getCriteriaBuilder();
        CriteriaQuery query = cb.createQuery(CarparkShareInfo.class);
        Root root = query.from(CarparkShareInfo.class);
        List predicates = new ArrayList();
        if (longitude != null && latitude != null) {
            predicates.add(cb.between(root.get("carpark").get("carparkLocation").get("longitude"),
                    longitude.subtract(longitudeScope).doubleValue(), longitude.add(longitudeScope).doubleValue()));
            predicates.add(cb.between(root.get("carpark").get("carparkLocation").get("latitude"),
                    latitude.subtract(latitudeScope).doubleValue(), latitude.add(latitudeScope).doubleValue()));
        }
        // 车位类型
        if (carparkType != null) {
            predicates.add(cb.equal(root.get("carpark").get("carparkType"), carparkType));
        }
        // 默认查询附近开启共享的车位
        if (status == null) {
            Byte[] bs = new Byte[] { 1, 2, 3 };
            predicates.add(root.get("carpark").get("status").in(Arrays.asList(bs)));
        } else {
            predicates.add(cb.equal(root.get("carpark").get("status"), status));
        }
        // 预计开始时间
        if (this.startTime != null) {
            SimpleDateFormat sdf = new SimpleDateFormat("HH:mm");
            String startTime = sdf.format(this.startTime);
            predicates.add(cb.lessThanOrEqualTo(root.get("startTime"), startTime));
        }
        // 当前天是否在共享周
        if (this.startTime != null) {
            Calendar calendar = Calendar.getInstance();
            calendar.setTime(this.startTime);
            int weekDay = calendar.get(Calendar.DAY_OF_WEEK);
            predicates.add(cb.like(root.get("shareDay"), "%" + weekDay + "%"));
        }
        // 预计结束时间
        if (this.endTime != null) {
            SimpleDateFormat sdf = new SimpleDateFormat("HH:mm");
            String endTime = sdf.format(this.endTime);
            predicates.add(cb.greaterThanOrEqualTo(root.get("endTime"), endTime));
        }
        if (this.availablePrice != null) {
            predicates.add(cb.lessThanOrEqualTo(root.get("unitprice"), availablePrice.toString()));
        }
        query.where(predicates.toArray(new Predicate[predicates.size()]));

        List list = em.createQuery(query).getResultList();
        return list;
    }
SpingBoot-JPA复杂查询,动态查询_第1张图片
image.png

controller层

// 查询
        List list = carparkFacade.findCarparkInReservation(longitude, latitude, carparkType,
                startTime, endTime, availablePrice);
        // 过滤
        List dataList = new ArrayList<>();
        for (CarparkShareInfo carparkShareInfo : list) {
            CarparkDTO dto = new CarparkDTO();
            CarparkShareInfoDTO sdto = new CarparkShareInfoDTO();
            // 使用spring框架提供的BeanUtils赋值,
            BeanUtils.copyProperties(carparkShareInfo.getCarpark(), dto);
            BeanUtils.copyProperties(carparkShareInfo, sdto);
            dto.setCarparkShareInfoDTO(sdto);
            dataList.add(dto);
        }
        return BabiDataResult.success("carparkList", dataList);

你可能感兴趣的:(SpingBoot-JPA复杂查询,动态查询)