【发布时间】:2020-07-30 18:51:47
【问题描述】:
我正在开发一个 Spring Boot - 具有多个实体的应用程序,这些实体具有一些相同的过滤列。
目前,我在多个存储库中定义了相同的查询,所以在做了一些研究之后,我偶然发现了一篇关于 JPA 的文章 - 规范:https://spring.io/blog/2011/04/26/advanced-spring-data-jpa-specifications-and-querydsl/
所以我创建了一个通用类来构建 JPA 规范:
public final class GenericSpecifications<T>
{
public Specification whereNameLikeAndDateGreatherThan(String fieldName, String fieldDate, String name, LocalDate date)
{
return (root, query, builder) -> builder.lessThan(root.get(columnName), date);
}
}
所以在服务中我可以使用:
repository.findAll(whereNameLikeAndDateGreatherThan(Person_.name, Person_.date, "Max", LocalDate.now());
这样,我在一个中心位置有一个查询/规范,我不需要在所有存储库上编写/维护相同的查询。
但是,我有更复杂的查询,需要过滤多个列。 这意味着我的 GenericSpecification-Class 中的方法变得过于臃肿,因为我需要传递多个列名和搜索值,所以我最终可能会得到带有 6 个或更多参数的方法。
我可以定义一个由所有其他实体扩展的抽象实体类。这个抽象实体将具有所有公共字段,以确保所有实体具有相同的列。 然后我可以使用这些名称进行过滤,因此我根本不必传递字段/列名称。
但是,我不确定这是否是解决我的问题的最干净的方法。 你知道是否有更好的方法来做到这一点?
【问题讨论】:
-
创建一个更高级别的构建器类来保留根和查询参数,并向单个规范添加额外的过滤器,然后在构建器完成后返回。
-
@daniu thx 回复,但您能否详细说明您的建议,因为我不确定这如何解决我的问题?
标签: java spring jpa specifications