Javaに優れた動的SQLビルダーライブラリはありますか?[閉まっている]


108

SquiggleのようなJava用の優れたSQLビルダーライブラリを知っている人はいます(メンテナンスされていないようです)。できれば、開発中のプロジェクト。

Zend_Db_Selectのような構文で、できればクエリを

String query = db.select().from('products').order('product_id');

上記の構文の「SELECT f1..fn FROM products ORDER BY product_id」に対する利点は何ですか?
Itay Moav -Malimovka 2013

4
@ ItayMoav-Malimovka、まあ、少なくとも、私の場合のSQLクエリの構文(JOOQを例にとると)は、コードの記述時にチェックされます。完全な構文オートコンプリートがあり、クエリの書き込みが高速化され、エラーが発生しやすくなります。
Vladislav Rastrusny 2013

これはIDEが改善すべき点であることに同意します。
Itay Moav -Malimovka 2013

1
@ ItayMoav-Malimovka、まあ... JOOQの場合、DB構造で何かを変更すると、新しいDB構造に従って修正するまで、コードはコンパイルを停止します。テキストとしてクエリがある場合、それらは壊れたままになります。
Vladislav Rastrusny 2013

例として、私は現在、大規模なレガシーデータベースで動作するようにステートメントを作成する必要があるアプリケーションに取り組んでいます。多くのステートメントは、SQL DSLによって構築するカスタム制約を共有しています。そのおかげで、コンパイル時に不明なステートメントを簡単に作成できます。
Rafael Winterhalter 2013

回答:


53

QuerydsljOOQは2つの一般的な選択肢です。


6
JOOQは、ハードコアSQL開発に適しているかもしれませんが、QuerydslのAPIはよりシンプルで、他のバックエンド(JPA、JDO、Lucene、Mongodbなど)もサポートしています。私もQuerydslの背後にいる会社にいます
TimoWestkämper11年

社内プロジェクトのいくつかでQuerydsl SQLを使用しています。jooqの個人的な経験はありませんが、大丈夫だと聞きました。
ponzao

11
QueryDslの問題は、生成されたクエリ自体が提供されないため、純粋なクエリジェネレーターとして使用できないことです。クエリが生成され、実行されます。あなたは別のものなしでは一つを手に入れることはできません。
Abhinav Sarkar 2013年

5
QuerydslとjOOQは最も一般的で成熟した選択肢のようですが、注意すべき点が1つあります。どちらもコード生成の概念に依存しており、データベースクラスとフィールドに対してメタクラスが生成されます。これにより、すてきでクリーンなDSLが容易になりますが、上記のOPの例のように、実行時にのみ認識されるデータベースのクエリを作成しようとすると問題が発生します。jOOQは文字列ベースのアプローチをサポートしていますが、いくつかの癖があります。Querydslのドキュメントでは、コード生成を使用できないかどうかについては触れられていません。私が間違っていたら訂正してください。
スベンジェイコブス

3
@SvenJacobs非常に古いコメントが、更新には、QueryDSLは、コード生成せずにSQLを構築することができません:stackoverflow.com/questions/21615956/...
Nagaraj Tantri

7

ddlutilsは私の最良の選択です:http : //db.apache.org/ddlutils/api/org/apache/ddlutils/platform/SqlBuilder.html

ここに作成例があります(groovy):

Platform platform  = PlatformFactory.createNewPlatformInstance("oracle");//db2,...
//create schema    
def db =        new Database();
def t = new Table(name:"t1",description:"XXX");
def col1 = new Column(primaryKey:true,name:"id",type:"bigint",required:true);
t.addColumn(col1);
t.addColumn(new Column(name:"c2",type:"DECIMAL",size:"8,2"));
t.addColumn( new Column(name:"c3",type:"varchar"));
t.addColumn(new Column(name:"c4",type:"TIMESTAMP",description:"date"));        
db.addTable(t);
println platform.getCreateModelSql(db, false, false)

//you can read Table Object from  platform.readModelFromDatabase(....)
def sqlbuilder = platform.getSqlBuilder();
println "insert:"+sqlbuilder.getInsertSql(t,["id":1,c2:3],false);
println "update:"+sqlbuilder.getUpdateSql(t,["id":1,c2:3],false);
println "delete:"+sqlbuilder.getDeleteSql(t,["id":1,c2:3],false);
//http://db.apache.org/ddlutils/database-support.html

1
@Entityで既に定義した列をもう一度定義する必要があるので、苦痛です。
huuthang 2017年

6

jOOQをお勧めできます。多くの優れた機能、直感的なSQL DSL、および極めてカスタマイズ可能なリバースエンジニアリングアプローチを提供します。

jOOQは、複雑なSQL、タイプセーフ、ソースコード生成、アクティブレコード、ストアドプロシージャ、高度なデータタイプ、およびJavaを流暢で直感的なDSLに効果的に組み合わせます。


使用しますか?どうやって見つけるの?
Vladislav Rastrusny、2011

3
DDLからカスタムソースコードを生成するために使用します。それは素晴らしいです!
Christopher Klewes

「jOOQライブラリにはSQLステートメントを作成するための優れたAPIがありますが、ステートメントの作成、データベースへの接続、データベースへのモデルの書き込み/読み取りなどを行うためのツールスイート全体が付属しています。AndroidアプリケーションVMの現在の性質により、 、64kメソッドの参照制限があります。jOOQには、使用時に10,000を超える参照メソッドを含めることができます。これは、制限と比較してそれほど多くないように見えるかもしれませんが、他に一般的に使用される大きなライブラリ(GuavaやGoogle Play Servicesなど)を考慮すると、その64kの制限に達するとはるかに簡単になります。」- android-arsenal.com/details/1/3202 :(
トマーシュFejfar

3

Hibernate Criteria API(プレーンSQLではありませんが、非常に強力でアクティブな開発中):

List sales = session.createCriteria(Sale.class)
         .add(Expression.ge("date",startDate);
         .add(Expression.le("date",endDate);
         .addOrder( Order.asc("date") )
         .setFirstResult(0)
         .setMaxResults(10)
         .list();

1
問題は、私が理解しているようにSQLにマップされないことです。
Vladislav Rastrusny、2011

7
これはSQLを生成せず、それが最小の驚きのルールに従っていない場合にデバッグするのは悪夢です(期待どおりに機能しません)

SQLを生成し(最後に)、誰も驚かない。利点-データベース間で移植可能です。
Vladimir Dyuzhev

3
クエリをまったく読めなくすることなく、JPA Criteria APIを使用して達成したクエリの複雑さのレベルはどのくらいですか?IN/ EXISTS句にネストされた選択の例、またはSaleエンティティのエイリアスを使用した自己結合などの例はありますか?私は好奇心が強い
Lukas Eder

1
コメントでは例を提供するためのスペースはあまりありませんが、docs.jboss.org / hibernate / core / 3.5 / reference / en / html /…
Vladimir Dyuzhev

0

次のライブラリを使用できます。

https://github.com/pnowy/NativeCriteria

ライブラリはHibernateの「SQLクエリの作成」の上に構築されているため、Hibernateがサポートするすべてのデータベースをサポートします(HibernateセッションとJPAプロバイダーがサポートされています)。ビルダーパターンが利用可能です(オブジェクトマッパー、結果マッパーなど)。

例はgithubページにあります。ライブラリはもちろんMavenセントラルで入手できます。

NativeCriteria c = new NativeCriteria(new HibernateQueryProvider(hibernateSession), "table_name", "alias");
c.addJoin(NativeExps.innerJoin("table_name_to_join", "alias2", "alias.left_column", "alias2.right_column"));
c.setProjection(NativeExps.projection().addProjection(Lists.newArrayList("alias.table_column","alias2.table_column")));

これは、SQLを手動で作成するよりも複雑です
EpicPandaForce

@EpicPandaForce私は非常に単純なケースに同意しますが、この条件の異なるセットがある非常に複雑な条件に基づいてその文字列を連結する必要がある場合、連結は非常に複雑です。その場合、正しく連結された文字列(すべての追加、結合、所有、パラメータセットなど)は面倒です。ソリューションを使用すると、この複雑さを処理するビルダーがあります。
Przemek Nowak
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.