我使用
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())
}
}
}
您确定使用自己的代码在内存中模拟数据库行为(通过规则集过滤多个对象)是个好主意吗?
对我来说,你似乎开始在这里构建一个内存数据库,这是你的意图吗?然后您也可以使用已经构建的 DTO,将您的 DTO 放在那里,然后查询它以进行过滤。
或者使用放置 DTO 的任何集合的
filter
方法。
您可能必须从以数据库为中心的 DTO 视图退回到更与对象相关的视图。您的示例看起来像是字符串
contains
方法的一个很好的用例。