【发布时间】:2015-11-12 13:57:41
【问题描述】:
我正在寻找一种动态创建参数化查询的方法。本质上,我想将查询与应用程序分离并使其可配置。
例如,我想创建一个带有参数的查询,例如
{ firstName: ?0 }
您可能知道,这在 Spring data mongodb 中使用接口是完全可行的:
interface MyQuery {
@Query("{firstName: ?0}")
public Person getByFirstName(final String name);
}
但这会在编译时结合我的查询,而我想在运行时更改它们。
但是我找不到动态使用这种机制的方法。在后台使用的特定类是StringBasedMongoQuery,并使用大量反射实用程序来确定查询、参数、返回类型等。我认为您可以使用 Groovy 管理其中的大部分,但是注释似乎是泡菜。
这让我觉得我选择了错误的方式来解决这个问题。
我自己只看到了几个选项:
- 自己重新实现 Spring 对 mongo 的奇特查询解析(似乎需要做很多工作)
- 自己实现穷人的查询参数替换。 (这不灵活,不会在空参数上产生正确的结果......)
我在这里不知所措,可惜我似乎无法独立使用StringBasedMongoQuery,它似乎与反射耦合。
更新:
我的建议在这里似乎毫无意义,因为我还注意到 Spring data mongodb 的 StringBasedMongoQuery 不支持带有可为空参数的“动态”查询;事实上,这是很合乎逻辑的,当参数为空时,很难从查询中删除部分内容,而且完全不可能做到这一点。
以下内容对这个问题有所说明:https://jira.spring.io/browse/DATAJPA-209
看来我可能的选择已经转移到:
- 我们进行不同的查询,使用的查询取决于可用的参数。这可能会给维护带来噩梦。
- 我们公开了一个 groovy 或其他 JVM 脚本,允许我们使用 Spring 或 mongodb Java 驱动程序中可用的 Criteria-esque API 之一,然后为我们构建查询。这样做的缺点是,想要配置查询的人现在必须至少了解 Java。
- 我们以牺牲可读性为代价使查询在需要时为空值安全。
【问题讨论】:
标签: mongodb dynamic parameters spring-data spring-data-mongodb