15

Java で SQL クエリをオブジェクトとして表すために使用できるライブラリがあるかどうか疑問に思っていました。

コードには、手書きの SQL クエリである java.lang.String 型の静的変数がたくさんあります。クエリを文字列ではなくオブジェクトとして表現できる、流暢なAPIを持つライブラリを探しています。

例:

Query q = select("DATE", "QUOTE")
  .from("STOCKMARKET")
  .where(eq("CORP", "?"))
  .orderBy("DATE", DESC);
4

7 に答える 7

13

Querydslは、SQL、JPA、および JDO バックエンドでのクエリをサポートしています。

上記の例は次のようになります。

query.from(stockmarket).where(stockmarket.corp.eq(someVar))
    .orderBy(stockmarket.date.desc())
    .list(stockmarket.date, stockmarket.quote);

Querydsl は、APT によるコード生成を使用して、SQL スキーマを Java クエリ タイプにミラーリングします。このようにして、クエリは完全にタイプ セーフ (または SQL の「スキーマ準拠」) になります。

私は Querydsl のメンテナーなので、この回答は偏っています。

ここで、Querydsl と他のフレームワークとの比較を公開しました。

于 2010-01-11T20:36:27.247 に答える
8

これらは、タイプセーフなSQLクエリを動的に作成するための優れたプロプライエタリライブラリです。

上記とは別に、常にあります

  • Hibernate / JPA CriteriaQuery
  • MyBatis

jOOQでのあなたの例:

create.select(DATE, QUOTE)
      .from(STOCKMARKET)
      .where(CORP.equal(123))
      .orderBy(DATE.desc());
于 2011-07-03T20:27:04.483 に答える
7

Jequelはかなり気の利いたように見えます:http ://www.jequel.de/

流暢なインターフェイスを使用しているため、(ドキュメントからの)自然なSQLのように読みやすくなっています。

SqlString sql = select(ARTICLE.OID)
               .from(ARTICLE, ARTICLE_COLOR)
               .where(ARTICLE.OID.eq(ARTICLE_COLOR.ARTICLE_OID)
               .and(ARTICLE.ARTICLE_NO.is_not(NULL)));

また、パラメーターを使用したデータソースに対するクエリの実行もサポートしているため、パラメーター化されたクエリの作成も処理します。

于 2009-05-15T04:00:09.047 に答える
7

http://www.hibernate.org/ おそらくJava用の最も強力なORMライブラリ。単純なクエリマッピングよりもはるかに多くのことができます。したがって、アプリケーションの他の場所に簡単に実装できます。あなたの場合、それはどういうわけかそのように行うことができます:

public class LookupCodeName
{
    private String code;
    private String name;

 /*... getter-setters ... */
}

public class someBL {

public List<LookupCodeName> returnSomeEntity() {
      SQLQuery sqlQuery =  (SQLQuery)((HibernateSession)em).getHibernateSession()
                        .createSQLQuery( "SELECT st.name as name, st.code as code FROM someTable st")
                        .addScalar("code")
                        .addScalar("name")
.setResultTransformer(Transformers.aliasToBean(LookupCodeName.class));
    }
return (List<LookupCodeName>)sqlQuery.list();
}
于 2009-05-05T14:50:24.260 に答える
2

Apache Empire-dbは、リレーショナル データベース抽象化レイヤーおよびデータ永続化コンポーネントであり、開発者はアプリケーション開発において、従来のオブジェクト リレーショナル マッピング フレームワーク (ORM) よりもはるかに SQL 中心のアプローチを取ることができます。

詳細はこちら: https://empire-db.apache.org/

クエーレ

http://xircles.codehaus.org/projects/quaere

于 2009-05-05T14:34:57.213 に答える
1

文字列クエリをマップしたくない場合は、クラスにエンティティとしてアノテーションを付け、それをテーブルにバインドする必要があります。そうすれば、休止状態またはJavaの永続性を使用できます。ただし、例は複雑すぎます。ただし、最後にクエリは次のように変換されます。

エンティティのリストを検索します。

 Criteria c = createCreteria(entityManager, StockMarket.class);
    // you can add "where" clause by using c.add(Restrictions); 
   // like this: c.add(Restrictions.ilike("name", "%somename%"); where "name" is your entity's field
     List<StockMarket> smList = c.list();

IDでオブジェクトを検索:

 StockMarket sm  = entityManager.find(StockMarket.class, id);
于 2009-05-06T07:18:41.810 に答える