考虑一个只需要实时搜索后备数据库的只读服务。该服务需要能够生成相当复杂的选择查询,以基于多表对象生成摘要,报告和结果。库/框架选择的优先级是(sql)的性能,可维护性和寿命。
Hibernate - 似乎需要"技巧"为了让它生成正确的SQL,Criteria API看起来很有前途,但在涉及任意查询时也有一些限制。
MyBatis - 没有类似Criteria的API,但它清晰干净,并且通常不需要Hibernate的技巧和推文。有限的数据库抽象。
其他一些尚待评估的解决方案包括:SQLBuilder,Squiggle,Querydsl,JOOQ或自定义解决方案。
SO用户发现什么最适合制作快速的多功能搜索服务。
[更新] - 我在Hibernate面临的一些技巧和问题是......
一般来说,两次加入同一张桌子似乎会引起问题。我甚至设法欺骗hibernate生成正确的SQL,只是让它映射结果错误,因为它缓存了实体的第一个实例,并假设第二个连接中的列是多余的。通过注释表达的条件连接也很痛苦。不是说它不可能,但非常神秘而且不直观。
要回答下面的X-Zero,我想从规范到结果。即,消费者告诉我他们所知道的,并且我构建了一个即时回答他们问题的查询。在实践中,我打算对他们可以传递的内容有一些限制。
答案 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 SETS
(CUBE()
,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的开发者,所以这个答案可能略有偏见。