Java中动态SQL库的比较

时间:2012-05-03 14:50:54

标签: java hibernate dynamic-sql mybatis

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

Hibernate - 似乎需要"技巧"为了让它生成正确的SQL,Criteria API看起来很有前途,但在涉及任意查询时也有一些限制。

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

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

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

[更新] - 我在Hibernate面临的一些技巧和问题是......

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

要回答下面的X-Zero,我想从规范到结果。即,消费者告诉我他们所知道的,并且我构建了一个即时回答他们问题的查询。在实践中,我打算对他们可以传递的内容有一些限制。

2 个答案:

答案 0 :(得分:3)

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

另外,要添加到列表中,还有Spring SQL Template个类和JDBI,但它们都没有解决SQL方言的问题。

答案 1 :(得分:3)

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

  

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

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

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

  

根据多表对象生成摘要,报告和结果。

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

  

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

jOOQ以您编写SQL的方式生成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进行了集成测试。这包括各种功能,这些功能在其他数据库中进行翻译和/或模拟。本博文中给出了一个例子,其中描述了其他RDBMS中MySQL的ON DUPLICATE KEY UPDATE子句的模拟:

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的开发者,所以这个答案可能略有偏见。