如何在 Spring Boot 中动态过滤 DTO 结果?

问题描述 投票:0回答:1

我使用

Spring Data JPA Specifications
来动态过滤某些
Spring Boot
应用程序中的实体,现在尝试对
DTO
而不是
entity
类应用相同的逻辑。

但是,据我在一些线程上看到的,例如好像不支持:

我们目前不支持 DTO 投影,因为我们不区分选择什么,我们只选择实体根

那么,动态过滤和排序

DTO
对象列表的正确方法是什么?我尝试创建一个自定义过滤方法,如下所示,但不确定是否有更好的方法用于此目的。那么,如何使用
DTO
动态过滤
Spring Boot
结果列表中的
Kotlin

class AccountDtoFilter(private val filterDTO: AccountFilterDTO) : Specification<AccountDTO> {

    companion object {

        fun createPredicate(filterDTO: AccountFilterDTO): Predicate? {
            val predicates = mutableListOf<Predicate>()

            if (filterDTO.name != null) {
                val namePredicate = criteriaBuilder.like(root.get<String>("name"), "%${filterDTO.name}%")
                predicates.add(namePredicate)
            }

            if (filterDTO.email != null) {
                val emailPredicate = criteriaBuilder.like(root.get<String>("email"), "%${filterDTO.email}%")
                predicates.add(emailPredicate)
            }

            // other filtering fields

            return if (predicates.isEmpty()) null else criteriaBuilder.and(*predicates.toTypedArray())
        }
    }
}

java spring-boot kotlin filter spring-data-jpa
1个回答
1
投票

您确定使用自己的代码在内存中模拟数据库行为(通过规则集过滤多个对象)是个好主意吗?

对我来说,你似乎开始在这里构建一个内存数据库,这是你的意图吗?然后您也可以使用已经构建的 DTO,将您的 DTO 放在那里,然后查询它以进行过滤。

或者使用放置 DTO 的任何集合的

filter
方法。

您可能必须从以数据库为中心的 DTO 视图退回到更与对象相关的视图。您的示例看起来像是字符串

contains
方法的一个很好的用例。

© www.soinside.com 2019 - 2024. All rights reserved.