« さよなら、スティーブ・ジョブズ | トップページ | 右足ががが・・・ »

2011.10.07

Aipo5のSQLTemplateを使う理由がわからない

自作ポートレットで com.aipo.orm.query.SelectQuery を使って一覧データを取得していたのだが、抽出条件を少し複雑な(サブクエリが三つも四つも出てくる的な)ものに変更しなければならなくなり、やってられんのでベタなSQLを書いてお茶を濁そうと、com.aipo.orm.query.SQLTemplate(以降AipoのSQLTemplateという)を使うことにした。

しかしどうやらこれがうまく行かない。SelectQueryと同じくデータオブジェクトのリストが取得できるのだが、そこから先のマッピングされた別テーブルのデータオブジェクトを取得できない。

AipoのSQLTemplateは、org.apache.cayenne.query.SQLTemplate(以降cayenneのSQLTemplate)をフィールドに持つラッパークラスなのだが、仕方なくソースを読んでみると、コンストラクタで、このフィールドに対してsetFetchingDataRows(true); とかやっている。つまり、このSQLTemplateではデータをDataRowのリストで取得すると高らかに宣言してるみたいなものですな。DataRowでは連携先のデータを参照できないはずだからそのまんまの挙動。なんだ使えないじゃん。

先に書いたようにAipoのSQLTemplateからはデータオブジェクトのリストが返されるのだが、どうやら(なぜそんなことをするのかは不明だけど)データ取得時に変換しているみたい。このとき、マッピングの情報と能力が失われる(というかDataRowには元からそんな機能はないわけで作り出せない)ようだ。

なにかうまいやり方があるのかもしれないが、調べる時間がもったいないから素直にcayenneのSQLTemplateを使って実装した。多少行数は増えるけど、たいした手間ではなかった。

変更前のソース:AipoのSQLTemplateを使用

String sql = "SELECT * FROM my_data_model ...";
SQLTemplate sqlTemplate = Database.sql(MyDataModel.class, sql);

sqlTemplate.param("foo", "bar");
sqlTemplate.param("hoge", "hogehoge");

ResultList list = sqlTemplate.getResultList();

変更後のソース cayenneのSQLTemplateを使用

String sql = "SELECT * FROM my_data_model ..." ・・・
SQLTemplate sqlTemplate = new SQLTemplate(MyDataModel.class, sql);

Map param = new HashMap();
param.put("foo", "bar");
param.put("hoge", "hogehoge");
sqlTemplate.setParameters(param);

ResultList list = new ResultList();
DataContext dctx = DatabaseOrmService.getInstance().getDataContext();
list.addAll(dctx.performQuery(sqlTemplate));

« さよなら、スティーブ・ジョブズ | トップページ | 右足ががが・・・ »

プログラミング」カテゴリの記事

Java / Apache」カテゴリの記事

コメント

コメントを書く

(ウェブ上には掲載しません)

トラックバック


この記事へのトラックバック一覧です: Aipo5のSQLTemplateを使う理由がわからない:

« さよなら、スティーブ・ジョブズ | トップページ | 右足ががが・・・ »

2019年5月
      1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31  
フォト

Google AdSense

銀の弾丸

無料ブログはココログ

他のアカウント