2

注: これは簡単な質問かもしれませんが、明確にする簡単な方法が見つかりません。では、この長い質問で申し訳ありません。

私が担当しているプロジェクトでは、Spring 2.5、Hibernate 3.3.2 をミドルウェアおよび Oracle データベースとして使用しています。データベースは他の多くのプロジェクトに関連しているため、一部のクエリは非常に複雑であり、Hibernate のソリューション (HQL、基準など) では解決できません。したがって、例として、JdbcTemplate の queryForX() メソッドの方が快適に感じます。

String sql = "select * from myTable";
jdbc.queryForList(sql);

確かに、ほとんどの場合、「どこ」の条件とパラメーターがあります。

jdbc.querForList(sql, new Object[]{obj1,obj2,obj3 /* and many more arguments... */})

この場合、疑問符「?」を書かなければなりません。パラメータの場合、SQL クエリ文字列が乱雑で読みにくいことがわかります。このようなもの:

select t1.col1, t2.col2, t1.col, --...some cols , 
    sum(nvl(some_col1,?)-nvl(other_col2,?)) over (partition by col1,col2,col3,col4) sum_of_cols 
from weird_table t1, another_table t2
where t1.col20=? and sum_of_cols>? and t1.col3=t2.col3 --and many ?'s...
and not exists (
    select ? from boring_table t3 where -- many ?'s
)
--group by  and order by order by etc

では、どの疑問符がどのパラメーターに対応するのでしょうか? 当たり前だけど読みにくい。ただし、次のようなバインドされたパラメーターには、他にもいくつかの解決策があります。

select * from a_table t where t.col1= :col1 and t.col2= :col2 -- and many more ":param"s

このタイプのクエリの場合、Hibernate の場合は次のように記述できます。

Query q = hibernateTemplate.createQuery();
q.setString("col1","a value");
q.setInteger("col2", 3);

どの値が何であるかがより読みやすく、理解しやすいと思います。SQLQuery でこれを実行できることはわかっています。

SQLQuery sq = hibernateTemplate.createSQLQuery();
/* same as above setInteger() etc. */

しかし、これsq.list()により、列名のないリストが表示されます。だから私は使いにくい基本的な配列を持っています:

[[1,2,"a"],[1,2,"b"], ...]

しかし、queryForList()私はより良いものを手に入れます:

[{COL1=1,COL2=2,COL3="a"},{COL1=1,COL2=2,COL3="b"},...]

したがって、 を使用する場合はqueryForList()、非常に面倒な params オブジェクトを作成する必要があります。または、使用SQLQueryしてから、列名としてマップなしでリストを取得する必要があります。

より読みやすいパラメーター設定 (query.setX()) などを使用してマップされたリストを使用する簡単なソリューションはありますか?

4

1 に答える 1

4

NamedParameterJdbcTemplateを使用してそれを行うことができます

サンプルはこちら

    String query = "INSERT INTO FORUMS (FORUM_ID, FORUM_NAME, FORUM_DESC)
 VALUES (:forumId,:forumName,:forumDesc)";
    Map namedParameters = new HashMap();
    namedParameters.put("forumId", Integer.valueOf(forum.getForumId()));
    namedParameters.put("forumName", forum.getForumName());
    namedParameters.put("forumDesc", forum.getForumDesc());
    namedParameterJdbcTemplate.update(query, namedParameters);

以下のリンクのソースコードで完全な例を確認してください

Spring NamedParameterJdbcTemplate チュートリアル

于 2013-03-05T19:06:56.677 に答える