美文网首页
SpingBoot-JPA复杂查询,动态查询

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

作者: TheUnforgiven | 来源:发表于2018-02-02 18:51 被阅读0次

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

Dao层

public List<CarparkShareInfo> getAroundCarparkInReservation() {
        CriteriaBuilder cb = em.getCriteriaBuilder();
        CriteriaQuery<CarparkShareInfo> query = cb.createQuery(CarparkShareInfo.class);
        Root<CarparkShareInfo> root = query.from(CarparkShareInfo.class);
        List<Predicate> predicates = new ArrayList<Predicate>();
        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<CarparkShareInfo> list = em.createQuery(query).getResultList();
        return list;
    }
image.png

controller层

// 查询
        List<CarparkShareInfo> list = carparkFacade.findCarparkInReservation(longitude, latitude, carparkType,
                startTime, endTime, availablePrice);
        // 过滤
        List<CarparkDTO> 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复杂查询,动态查询

      本文链接:https://www.haomeiwen.com/subject/jywezxtx.html