JPA如何实现参数的动态查询

DROP TABLE
IF
	EXISTS `t_ asset_attribution`;
CREATE TABLE `t_ asset_attribution` (
	`id` BIGINT ( 0 ) NOT NULL AUTO_INCREMENT COMMENT '资产归属-主键ID',
	`asset_type` VARCHAR ( 50 ) CHARACTER 
	SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL COMMENT '资产类型',
	`asset_class` VARCHAR ( 50 ) CHARACTER 
	SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL COMMENT '资产类别',
	`asset_model` VARCHAR ( 50 ) CHARACTER 
	SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL COMMENT '资产型号',
	`asset_manager` VARCHAR ( 50 ) CHARACTER 
	SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL COMMENT '资产管理人',
	`data_status` VARCHAR ( 50 ) CHARACTER 
	SET utf8mb3 COLLATE utf8mb3_general_ci NULL DEFAULT '启用' COMMENT '数据状态(启用、禁用)',
	`del_flag` VARCHAR ( 20 ) CHARACTER 
	SET utf8mb3 COLLATE utf8mb3_general_ci NULL DEFAULT 'USE' COMMENT '是否删除(USE:使用;DELETE:删除)',
	PRIMARY KEY ( `id` ) USING BTREE 
) ENGINE = INNODB AUTO_INCREMENT = 1 CHARACTER 
SET = utf8mb3 COLLATE = utf8mb3_general_ci COMMENT = '资产归属' ROW_FORMAT = Dynamic;

SET FOREIGN_KEY_CHECKS = 1;

上面是我数据表的字段,我想动态查询资产类型、资产类别、资产型号、资产管理人的数据

实现的方法:

    //region 这段代码是一个静态方法 where(),用于生成一个 JPA Specification 对象,该对象可以用于动态查询 TAssetAttributionEntity 实体类的数据

    /**
     * 这段代码是一个静态方法 where(),用于生成一个 JPA Specification 对象,该对象可以用于动态查询 TAssetAttributionEntity 实体类的数据
     *
     * @param assetType    资产类型
     * @param assetClass   资产类别
     * @param assetModel   资产型号
     * @param assetManager 资产管理人
     * @return
     */
    public static Specification<TAssetAttributionEntity> where(
            String assetType,
            String assetClass,
            String assetModel,
            String assetManager) {
        return (root, query, criteriaBuilder) -> {
            List<Predicate> predicates = new ArrayList<>();
            if (assetType != null && !assetType.isEmpty()) {
                predicates.add(criteriaBuilder.equal(root.get("assetType"), assetType));
            }
            if (assetClass != null && !assetClass.isEmpty()) {
                predicates.add(criteriaBuilder.equal(root.get("assetClass"), assetClass));
            }
            if (assetModel != null && !assetModel.isEmpty()) {
                predicates.add(criteriaBuilder.equal(root.get("assetModel"), assetModel));
            }
            if (assetManager != null && !assetManager.isEmpty()) {
                predicates.add(criteriaBuilder.equal(root.get("assetManager"), assetManager));
            }
            predicates.add(criteriaBuilder.equal(root.get("delFlag"), "USE")); // 添加 delFlag 的查询条件
            return criteriaBuilder.and(predicates.toArray(new Predicate[0]));
        };
    }
    //endregion

    //region 分页查询数据

    /**
     * 分页查询数据
     *
     * @param entity    查询的数据
     * @param page      要查询的页码,从 0 开始计数
     * @param size      每页的数据量
     * @param sort      排序字段,默认根据创建时间排序
     * @param sortOrder 正序还是倒序,默认是倒叙(desc)
     * @return
     */
    @Override
    public BaseResponseModel pageQuery(TAssetAttributionDTO entity, int page, int size, String sort, String sortOrder) {
        Sort.Direction direction = Sort.Direction.DESC;
        //默认根据创建时间排序
        String order = "created_time";
        //region 排序字段不为空
        if (sort != null && !sort.isEmpty()) {
            if ("ASC".equalsIgnoreCase(sort)) {
                direction = Sort.Direction.ASC;
            }
            if ("DESC".equalsIgnoreCase(sort)) {
                direction = Sort.Direction.DESC;
            }
        }
        //endregion

        //region 排序字段根据传过来的数据排序
        if (sortOrder != null && !sortOrder.isEmpty()) {
            order = sortOrder;
        }
        //endregion

        Pageable pageable = PageRequest.of(page, size, Sort.by(direction, order));

        String assetType = entity.getAssetType();
        String assetClass = entity.getAssetClass();
        String assetModel = entity.getAssetModel();
        String assetManager = entity.getAssetManager();

        Page<TAssetAttributionEntity> entityPage;
        if (StringUtils.isEmpty(assetType) && StringUtils.isEmpty(assetClass) && StringUtils.isEmpty(assetModel) && StringUtils.isEmpty(assetManager)) {
            entityPage = tAssetAttributionRepository.findAll(pageable);
        } else {
            entityPage = tAssetAttributionRepository.findAll(where(assetType, assetClass, assetModel, assetManager), pageable);
        }

        List<TAssetAttributionEntity> mapList = entityPage.getContent();
        if (mapList == null || mapList.size() == 0) {
            return ResultUtil.dataReturn(true, "未查询到您要找的内容,请重新查找!", mapList);
        } else {
            return ResultUtil.dataReturn(true, "查询数据成功!", mapList);
        }
    }
    //endregion

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值