menu
書いてる野郎
orebike@gmail.com
S2JDBCでは文字列のSQLをクエリとして投げるやりかたもある。
このやり方はJavaコードでSQLを全部構築できるので、
ということがある。
・・・が・・・このような場合は大体設計に無理があるので、変な制約がない限りは使わないほうが無難だ。
List<Hoge> results = jdbcManager.selectBySql(Hoge.class, "SELECT " + " * " + "FROM " + " hoge " + "WHERE " + " piyo_id = ? AND " + " fuga_id = ?", 10, 20) .getResultList();
のように使う。第一引数に戻す型のクラスをとり、第二引数にSQL、第三引数以降にプレースホルダに入れるパラメータを埋め込む順番に記述する。
SQLは全部文字列なので当然なにも考えず
List<Hoge> results = jdbcManager.selectBySql(Hoge.class, "SELECT " + " * " + "FROM " + " hoge " + "WHERE " + " piyo_id = 10 AND " + " fuga_id = 20") .getResultList();
のような記述でもできる。しかし10と20の部分が外部からの変数になった時にSQLインジェクションの危険性を避けられないのでプレーすホルダを使ったほうが無難。
クエリの結果はカラム名とプロパティを一致させておくと勝手にマッピングしてくれる。
DB側(スネーク)→Java側(キャメル)というように自動マッピングされる。
DB側の結果のpiyo_id
カラムの値はJava側のHogeDtoクラスのpiyoId
プロパティに自動的に格納されるということだ
結果を受け用のクラスを作らずに BeanMap でお手軽に受けることもできる。BeanMap というのは Apache 系のパッケージにも存在するが、この場合は Seasar2 系のパッケージの BeanMap を使わないと値がマッピングされない。 単に Map に詰め込まれるのでは無いみたいだ。