7

考虑一个需要实时搜索后备数据库的只读服务。该服务需要能够生成相当复杂的选择查询,以基于多表对象生成摘要、报告和结果。库/框架选择的优先级是(sql 的)性能、可维护性和寿命。

Hibernate - 似乎需要“技巧”才能让它生成正确的 SQL,Criteria API 看起来很有希望,但在任意查询方面也有一些限制。

MyBatis - 没有类似 Criteria 的 API,但它清晰干净,通常不需要 Hibernate 的技巧和技巧。有限的数据库抽象。

其他一些尚待评估的解决方案包括:SQLBuilder、Squiggle、Querydsl、JOOQ 或自定义解决方案。

SO 用户发现的内容最适合制作快速的多功能搜索服务。

[更新] -我在使用 Hibernate 时遇到的一些技巧和问题是......

一般来说,加入同一张表两次似乎会导致问题。我什至设法欺骗 hibernate 生成正确的 SQL 只是让它映射结果错误,因为它缓存了实体的第一个实例并假设来自第二个连接的列是多余的。通过注释表达的条件连接也很痛苦。并不是说这是不可能的,而是非常神秘且不直观。

为了回答下面的 X-Zero,我想从规范到结果。即,消费者告诉我他们知道什么,然后我构建一个查询来即时回答他们的问题。在实践中,我打算对它们可以传递的内容进行一些限制。

4

2 回答 2

3

对于面向查询的服务,我强烈建议远离 Hibernate 或类似的 JPA 框架。MyBatis 可能是一个不错的选择,它为从 SQL 片段动态构造查询提供了一些基本的脚本支持,但您必须自己处理 SQL 方言。

此外,要添加到您的列表中,还有Spring SQL 模板类和JDBI,尽管它们都没有解决 SQL 方言的问题。

于 2012-05-03T16:43:23.087 回答
3

根据您的要求,我认为jOOQ将是一个很好的匹配。您还提到了 jOOQ 作为潜在框架之一,所以让我们从 jOOQ 的角度考虑您的需求:

该服务需要能够生成相当复杂的选择查询

jOOQ 将 SQL 建模为 Java 中的内部特定领域语言。这意味着 SQL(或看起来几乎像 SQL 的东西)是使用 Java 对象和方法构造的。我最近写了一篇关于 jOOQ 的 DSL / fluent API 是如何构建的博客,以及为什么它允许任意复杂查询的类型安全构建。请参阅此处的博客文章(包括一个相当复杂的查询):

http://blog.jooq.org/2012/01/05/the-java-fluent-api-designer-crash-course/

基于多表对象生成摘要、报告和结果。

jOOQ 包含用于生成摘要、报告等的高级 OLAP 功能。支持的功能包括GROUPING SETS( CUBE(), ROLLUP())、数据透视表、分层查询、窗口函数和任意 SQL。

库/框架选择的优先级是(sql的)性能,

jOOQ 以您编写的方式生成 SQL。

可维护性

jOOQ 附带一个源代码生成器,将您的数据库模式建模为 Java 代码。这类似于 Hibernate 和/或 QueryDSL 能够做的事情。当您的架构更改时,您的 Java 代码也会更改(可能导致编译错误)

和长寿。

jOOQ 已经成熟,每年有 10k 的下载量,而且还在不断增长。API 在过去的版本中一直非常稳定。

Hibernate - 似乎需要“技巧”才能让它生成正确的 SQL,Criteria API 看起来很有希望,但在任意查询方面也有一些限制。

Hibernate 生成 HQL(或 JPQL),而不是 SQL。您无法通过 Hibernate 充分利用 SQL 功能。

MyBatis - 没有类似 Criteria 的 API,但它清晰干净,通常不需要 Hibernate 的技巧和技巧。

对于您的目标,这也是一个不错的选择

有限的数据库抽象。

jOOQ 的 API 对于每个底层数据库都是相同的。生成的 SQL 针对 13 个主要 RDBMS 进行了集成测试。这包括在其他数据库中翻译和/或模拟的各种功能。这篇博文给出了一个这样的例子,其中ON DUPLICATE KEY UPDATE描述了在其他 RDBMS 中模拟 MySQL 的子句:

http://blog.jooq.org/2012/05/01/how-to-simulate-mysqls-insert-statement-extensions/

或者正确处理DUAL表格有多么棘手:

http://blog.jooq.org/2011/10/16/sql-trouble-with-dummy-tables/

免责声明:我是 jOOQ 的开发者,所以这个答案可能有点偏颇。

于 2012-05-04T12:30:46.060 回答