7

バッキングデータベースのリアルタイム検索を実行する必要がある読み取り専用サービスについて考えてみます。サービスは、マルチテーブルオブジェクトに基づいて要約、レポート、および結果を生成するために、かなり複雑な選択クエリを生成できる必要があります。ライブラリ/フレームワークの選択の優先順位は、(SQLの)パフォーマンス、保守性、および寿命です。

Hibernate-正しいSQLを生成するために「トリック」が必要なようです。CriteriaAPIは有望に見えますが、任意のクエリに関してはいくつかの制限もあります。

MyBatis -CriteriaのようなAPIはありませんが、明確でクリーンであり、Hibernateのトリックやtweeksを必要としないことがよくあります。限られたデータベースの抽象化。

その他のまだ評価されていないソリューションには、SQLBuilder、Squiggle、Querydsl、JOOQ、またはカスタムソリューションが含まれます。

SOユーザーが見つけたものは、高速で用途の広い検索サービスを作成するのに最適です。

[更新] -Hibernateで直面したトリックと問題のいくつかは...

一般に、同じテーブルに2回結合すると、問題が発生するようです。エンティティの最初のインスタンスをキャッシュし、冗長な場合は2番目の結合からの列を想定したため、Hibernateをだまして正しいSQLを生成させ、結果を誤ってマップさせることさえできました。アノテーションを介して表現される条件付き結合も苦痛です。それが不可能だと言っているわけではありませんが、非常に不可解で直感的ではありません。

以下のX-Zeroに答えるために、仕様から結果に移行したいと思います。つまり、消費者は彼らが知っていることを私に話し、私は彼らの質問にその場で答えるクエリを作成します。実際には、私は彼らが渡すことができるものにいくつかの制限を設けるつもりです。

4

2 に答える 2

3

あなたの要件から、 jOOQはぴったりだと思います。また、jOOQ を潜在的なフレームワークの 1 つとして言及したので、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 は成熟しており、年間 10,000 件のダウンロードがあり、成長を続けています。API は、過去のリリースを通じて非常に安定しています。

Hibernate - 正しい SQL を生成するには「トリック」が必要なようです。Criteria API は有望に見えますが、任意のクエリに関してはいくつかの制限があります。

Hibernate は、SQL ではなく HQL (または JPQL) を生成します。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 に答える
3

クエリ指向のサービスについては、Hibernate や類似の JPA フレームワークから離れることを強くお勧めします。MyBatis は適切な選択であり、SQL フラグメントからクエリを動的に構築するための基本的なスクリプト サポートを提供しますが、SQL ダイアレクトを自分で処理する必要があります。

また、リストに追加するために、Spring SQL TemplateクラスとJDBIもありますが、どちらも SQL ダイアレクトの問題に対処していません。

于 2012-05-03T16:43:23.087 に答える