用于查询的Spring Data API,无需使用ORM

时间:2018-04-18 17:28:16

标签: jpa nosql spring-data

是否存在一个在Spring Data后端中通用的接口,我们可以传递JPQL查询并返回可以支持嵌套分层数据的List<Map<String, Object>或类似的通用数据结构?

我的目标是创建一个适用于多个NoSQL后端的应用程序,而无需事先了解表/集合的架构。我找到了MongoTemplateMongoOperationsCassandraTemplateCassandraOperations,但这些都没有实现公共接口。

我的问题的后半部分是我不想为每个表/集合创建DAO,因为直到运行时我都没有这方面的知识。

这些要求是否排除了使用Spring Data?

2 个答案:

答案 0 :(得分:2)

你应该看看Hibernate OGM,它支持许多NoSQL DB,也许有办法将它与Hibernate的dynamic models结合起来。

与大多数JPA提供商相比,

DataNucleus JDO似乎对NoSQL有更广泛的支持。但是,我不确定是否支持动态模式。

Eclipselink似乎也支持some NoSQL DBs,并提供an API for dynamic entities;但是,我无法找到一份体面的最新文档。

答案 1 :(得分:2)

传递JPQL查询以获取通用对象是没有意义的。

我想说JPA和ORM的目的是帮助“知道对象”(应用程序实际使用的对象)。如果您的应用程序使用“通用”对象,则意味着它们仅“用于”显示而不是其他任何内容。

您可以构建像Map<String, String>这样的动态对象但是到了什么程度?如果仅用于显示,那么最好省略持久性并编写“数据库浏览器” - 一个在运行时读取模式并创建您提到的层次结构的应用程序。

如果您想要运行JPQL查询,那么您的应用程序中已经有了一些持久对象,并且您可能需要连接到与您的设计完全匹配的后端数据库。或者您可能尝试将JPQL用作“可移植”SQL。在任何一种情况下,您都需要动态映射。您可以使用上面提到的“数据库浏览器”来确定在运行时需要将哪些表和列映射到“已知对象”。

您可以为每个“已知对象”编写一个带有自定义实例的通用DAO类,或者您可以重写EntityManager的配置文件以获得正确的映射。

我希望这会有所帮助。