サブクエリーや集計などについて

187 views
Skip to first unread message

たかみん

unread,
Apr 9, 2011, 4:49:32 AM4/9/11
to Aipo User
はじめまして、AIPOのポートレットで業務用のシステムを開発しております。

先日、データ処理においてGROUP BY をともなう集計処理が必要になったので調べてみたのですが、結局cayenne-2.0.4では対応してい
ないようでしたので、とりあえずあきらめて代替手段で何とかしました。直接SQLを投げて、Mapでデータを受けとるのは可能だったのですが、連携テー
ブルが多くメンテ性が落ちるのでその方法は不採用とし、ロジックでゴリゴリする方法を選びました。

cayenne-3 では集計クエリやサブクエリに対応しているようですが、時間が許せば使ってみたいのですが、今まで「こんな問題が出た」とか「問題
なく動いている」とかいった情報はありますでしょうか。
上記のようにとりあえずは何とかしたので、今のところ緊急性はないのですが、将来の為ということで。

また、cayenneのバージョンを上げなくても、オブジェクトのマッピングを保ったまま利用できる方法があるなら教えていただきたいです。

よろしくお願いいたします。

Nobuhiko Beppu

unread,
Apr 14, 2011, 10:41:54 PM4/14/11
to Aipo User
たかみんさん

アイポコミッターの別府です。

サブクエリなどの複雑な SQL を利用する場合は、以下のようなコードでマッピングを維持したままデータを取得することが可能です。
Database ユーティリティは Cayenne の薄いラッパーになっています。

String sql =
"select * from turbine_user where last_name = (select last_name
from eip_m_addressbook where last_name = #bind($last_name))";
List<TurbineUser> result =
Database
.sql(TurbineUser.class, sql)
.param("last_name", "テスト")
.fetchList();

ただし、集計クエリなどは count() や max() などと同時に利用することが多いと思いますので、
この場合はマッピングされない count() や max() を取得するためにマップで取得する必要があります。

String sql =
"select disabled, count(*) from turbine_user group by disabled";
List<DataRow> result =
Database.sql(TurbineUser.class, sql).fetchListAsDataRow();

なお、Cayenne 3 での集計クエリやサブクエリ対応については試したことがないため、ここでは申し上げられませんが、
3 にアップブレードして、アイポで動作させる場合は一点注意点があります。
cayenne.jar の中には、実は cayenne 以外の apache プロジェクト(commons とか velocity とか)のラ
イブラリが同梱されておりまして、
3 にあげた場合に、それらのバージョンもあがってしまいます。
このとき、アイポ本体との依存関係につきまして競合が発生する可能性がありますので、これらを別途解決する必要がありそうです。

以上、ご参考になればと思います。

たかみん

unread,
Apr 15, 2011, 1:41:44 AM4/15/11
to Aipo User
別府さん、詳しい情報ありがとうございます。

cayenne3へのバージョンアップはやはり少し躊躇してしまいますね。
現開発が終わってひと段落してからチャレンジしてみます(可能なら)

サブクエリに関しては機会があれば試せそうですね。
いずれにせよcayenneの範疇の質問だったようで恐縮です。m(_ _)m
Reply all
Reply to author
Forward
0 new messages