如何获得弹簧数据的通用搜索/查找方法?

时间:2013-09-03 09:21:21

标签: spring spring-data spring-data-jpa

我所需要的只是为我的所有存储库提供通用的搜索/查找方法。 像这样:

public interface BaseRepository<T, ID extends Serializable>
    extends PagingAndSortingRepository<T, ID> {

    Iterable<T> search(SearchParameters sp);

}

其中SearchParameters对象表示每个属性的一组值,可能是应用于它们的条件。

Jpa Criteria可能是要走的路,但我真的很难找到符合我需求的东西。

1 个答案:

答案 0 :(得分:0)

我使用了一种方向相同的方法,但我宁愿说它是动态方法而不是通用方法。它现在工作得很好,我们只需给出搜索实体就可以自动生成所有需要的过滤器。我还认为标准api是要走的路,但是过了一段时间它只是太乱了所有的副作用,我转过身来创建带参数的查询字符串。

我创建了一个实体扫描器,它接受所有域实体并为每个所需的过滤器生成filterdefinition对象。此扫描程序采用实体并跟踪属性达到一定级别(以保持过滤器的数量)。我不能在这里给你代码,因为它属于客户,但我可以提供的方法。

我在filterdefinition中需要的是:entitytype,propertypath,propertytype,valuesexpression,以防我们渲染选项(想想masterdata),需要连接(以避免连接多次相同的表),打开/关闭括号。这是过滤器的定义。

然后您需要一个包含用户当前配置的值对象:Inputvalue,operator(&gt; =),括号,过滤器链接(和/或)。

有了这个,我们可以渲染一个完全动态的过滤引擎,但有一些小的限制。即我还没有实现对同一实体的父搜索。

您可以简单地为每个过滤器生成一个子查询。喜欢:其中id in(select ....)和/或id in(select ...)如果实体数量不是太高,这样就行了,但是如果行数你会觉得几个子查询的性能损失在域实体表中很高。 然后你潜入并找到一种方法来分离属性路径所需的连接,并且在querycreator中你只需要在必要时再次设置加入实体的方法。

如上所述。从简单开始。获取字符串等简单类型的第一级属性并创建查询引擎。通过遵循特定的实体连接来增强它,之后你可以发疯并介绍为选择渲染提取选项的表达式或使用转换服务输入参数等等。