Home > Java | Seasar > Namesにjoinクエリ用文字列 -> Seasar2.4.30とS2JDBC-Gen 0.9.2で解決

Namesにjoinクエリ用文字列 -> Seasar2.4.30とS2JDBC-Gen 0.9.2で解決

whereはConditionで辿れるけど、そのConditionが使うjoinが辿れないので、S2JDBC-Genで生成されるNamesにそのテーブルから繋がっているテーブルすべてを網羅するjoinクエリ用文字列があれば便利かも。

"table1List"
"table1List.table2List"
"table1List.table2List.table3List"
  • [追記: 19:53]

ひがさんがコメントくださったように、書いた直後に新しくリリースされたSeasar2.4.30とS2JDBC-Gen 0.9.2で解決しました。しかも、流れるように書けるというもっといい感じに解決。

  • 利用例
    • leftOuterJoinの中は、static importsされたものでS2JDBC-Gen 0.9.2が生成するNames(例ではThesisStudentUserNames)に定義されている
    • whereのConditionもS2JDBC-Gen 0.9.2が生成している
    • orderByの中のdesc()は、org.seasar.extension.jdbc.operation.Operationsが持っている
public ThesisStudentUser findByUidOrderByYear(String uid) {
    return select()
        .leftOuterJoin(year())
        .leftOuterJoin(studentUser())
        .leftOuterJoin(thesisAssignmentList())
        .where(new ThesisStudentUserCondition().studentUser().uid.eq(uid))
        .orderBy(desc(year().year()))
        .getSingleResult();
}

すごい綺麗になった気がします。ただ次のようにConditionをandでつなぐケースだけはちょっと複雑になってしまうかもしれない感じ(何か別の書き方があるのかもしれない)。別の書き方をkoichikさんに教えていただきました、↓の方に追記あります。

public ThesisProfUser findByUidAndYear(String userId, int year) {
    return select()
        .leftOuterJoin(year())
        .leftOuterJoin(profUser())
        .leftOuterJoin(thesisAssignmentList())
        .leftOuterJoin(thesisAssignmentList().thesisStudentUser())
        .leftOuterJoin(
            thesisAssignmentList().thesisStudentUser().studentUser())
        .leftOuterJoin(thesisAssignmentList().assignmentVoteList())
        .where(
            new ThesisProfUserCondition().profUser().uid.eq(userId).and(
                new ThesisProfUserCondition().year().year.eq(year)))
        .getSingleResult();
}

何にせよS2JDBC-Gen使うとS2JDBCが異次元的に強力になりヤバいです。たぶん羽生さんのらくらくERDレッスンで勉強して組んだテーブルとの相性の良さは僕が知っているO/Rマッパーの中で一番高いと思う(残念ながらERDレッスンを未だに読み終えてないので似非テーブル設計しかできてないけど・・・)。

  • [追記: 21:30]

さらにkoichikさんがコメントくださったように、Conditionの部分も流れるように書けました!

public ThesisProfUser findByUidAndYear(String userId, int year) {
    return select()
        .leftOuterJoin(year())
        .leftOuterJoin(profUser())
        .leftOuterJoin(thesisAssignmentList())
        .leftOuterJoin(thesisAssignmentList().thesisStudentUser())
        .leftOuterJoin(
            thesisAssignmentList().thesisStudentUser().studentUser())
        .leftOuterJoin(thesisAssignmentList().assignmentVoteList())
        .where(eq(profUser().uid(), userId), eq(year().year(), year))
        .getSingleResult();
}

これは素晴らしい。。。XxxConditionいらないですね。

add to hatena hatena.comment (0) add to del.icio.us (0) add to livedoor.clip (0) add to Yahoo!Bookmark (0) Total: 0 |twitterに投稿する

コメント:14

ひが 2008-10-03 (金) 16:10

S2JDBC-genの次のバージョンから
table1List().table2List().table3List()のように
関連名やカラム名は、
タイプセーフに指定できるようになります。
もちろん、いくらでもネストできます。

jfut 2008-10-03 (金) 16:47

おー、それは良いことを聞きました。ありがとうございます。
次のバージョンが出たら試してみます。

ひが 2008-10-03 (金) 18:13

新しいバージョンがリリースされましたね。

staticインポートを使うので、Eclipseの設定で、
Preference -> Java -> Code Style -> Organize Importsの
Number of static importsを1に設定してください。

jfut 2008-10-03 (金) 18:49

早速使ってstatic importsの設定使ってなかったのではまってました。ありがとうございます。
ただNumber of static importsを1にした状態で、生成されたServiceでCtrl + Shift + Oでimportの自動補完を実行すると、
import static org.seasar.extension.jdbc.operation.Operations.*;
が追加され、こうなるとEclipseが
The import org.seasar.extension.jdbc.operation.Operations never used
というWarningを出すようになりました。他の設定が悪いのかもしれませんが、Number of static importsを2にして仮対応しています(Eclipse 3.4.1)。

また、ActionでhogeService.select()をおもいっきし使ってしまっていたのでserviceへ移植中です。select()はActionで使わせない方が良いという理由は考えてみたら納得しましたが、既に使っている人は結構びっくりするかもしれないので判り易く周知した方が良いかもしれません。

jfut 2008-10-03 (金) 20:09

Number of static imports 2だとない状態からimportしてくれないみたいで余計ダメダメだったので1にしてWarning無視することにしました。。取り急ぎご報告までに。

koichik 2008-10-03 (金) 21:00

> The import org.seasar.extension.jdbc.operation.Operations never used

Eclipse の問題です.
アプリのルートパッケージの名前がアルファベット順で org.seasar.extension… より前だと生成されないんじゃないかと思います.jp.〜 とかなら大丈夫だった気が.

> andでつなぐケース

複数の Condition を並べることができます.and() は or() と組み合わせた場合のカッコの入れ子を制御するためのものです.

.where(
new ThesisProfUserCondition().profUser().uid.eq(userId),
new ThesisProfUserCondition().year().year.eq(year))

っていうか,新しく生成された Service では XxxCondition を使わなくても Operations のメソッドが使えます.こっちの方がはまりにくくてよさげ.

.where(new ThesisStudentUserCondition().studentUser().uid.eq(uid))

.where(eq(studentUser().uid(), id))

と書けます.

.where(
new ThesisProfUserCondition().profUser().uid.eq(userId).and(
new ThesisProfUserCondition().year().year.eq(year)))

.where(eq(profUser().uid(), userId), eq(year().year(), year)))

と書けます.たぶん.

関係ないけど Vista で WebDAV つながりません.URL が間違ってる言われます...

jfut 2008-10-03 (金) 21:30

> koichikさん

>> アプリのルートパッケージの名前がアルファベット順で org.seasar.extension… より前だと生成されないんじゃないかと思います.jp.〜 とかなら大丈夫だった気が.

ちょうど作っているのがjp.〜なんですが、これでダメなようです。別の設定箇所何かないか探してみます。

>> っていうか,新しく生成された Service では XxxCondition を使わなくても Operations のメソッドが使えます.こっちの方がはまりにくくてよさげ.

こ、これはすごく良いですね。後で記事も直しておきます。ありがとうございます。

>> 関係ないけど Vista で WebDAV つながりません.URL が間違ってる言われます...

自分のVista環境もダメでした。。。VistaのWebDAVクライアントはWindows Updateでしょっちゅう壊れるので、お手数ですが別のWebDAVクライアントソフトウェアを使ってみてください。Vista環境でCarotDAVというソフトでSeasar.orgのリポジトリに繋がることを確認しました。

koichik 2008-10-03 (金) 22:00

> ちょうど作っているのがjp.〜なんですが、

ごめんなさい,org.seasar.extension よりも後だったら,ですね.
Preferences の Organize Imports で jp が org より後に来るようにすれば消えるんじゃないかなぁ (消えるのは static import じゃなくて警告でした).

> Vista環境でCarotDAV

ありがとうございます.試してみます.

> select()

移行の注意に書くのを忘れてました.追記しました.

jfut 2008-10-03 (金) 23:40

> Preferences の Organize Imports で jp が org より後に来るようにすれば消えるんじゃないかなぁ (消えるのは static import じゃなくて警告でした).

jpを追加してorgより後、前にしても警告消えませんでした。試しにorgを消した状態でもダメでした。新しいS2JDBCの使い方が気に入っているので、この部分だけWarning気にしないという勝手ルールでこのまま使いたいと思います。

> 移行の注意に書くのを忘れてました.追記しました.

ありがとうございます。

koichik 2008-10-04 (土) 1:00

> 警告消えませんでした

おかしいなぁ,s2-tiger の中にある OperationsTest は

import static org.seasar.extension.jdbc.operation.Operations.*;
import static org.seasar.extension.jdbc.where.EmployeeNames.*;

ってなってて警告出てないんですよ.でも,この順番を逆にすると警告が出るので,順番が影響してるかと思ったんですけどねぇ.
OperationsTest で使ってる EmployeeNames は S2JDBC-Gen で生成したものではないので,微妙に違っているのだろうか...

jfut 2008-10-04 (土) 1:54

> でも,この順番を逆にすると警告が出るので,順番が影響してるかと思ったんですけどねぇ.

なるほど判りました。確かに順番逆にすると警告でなくなります。ただ、Organize Importsで定義したソート順は通常のimportには効くものの、static importのソート順では無視されているようです。

ためしに
org.seasar.extension.jdbc.where.EmployeeNames
のパッケージを
jp.example.extension.jdbc.where.EmployeeNames
に変えて、Organize Importsのソート順定義にjpを加えて状況確認しました。

jfut 2008-10-04 (土) 2:00

書いた直後に解決しました。。。Organize Importsで定義したソート順、orgとjpの両方をstaticでやっていませんでした。New Staticからorgとjpを追加して、
* org (static)
* jp (static)
* java (package)
* javax (package)
* org (package)
* com (package)
としたところ意図する順番になり、Warning出なくなりました。いろいろとアドバイスありがとうございました、無事解決です。

taedium 2008-10-04 (土) 22:09

次のバージョン(0.9.3)でOrganize Importsでstatic importの並び順を指定しなくても大丈夫にする(警告がでないように調整する)予定です。

jfut 2008-10-04 (土) 23:31

> 次のバージョン(0.9.3)でOrganize Importsでstatic importの並び順を指定しなくても大丈夫にする(警告がでないように調整する)予定です。

ありがとうございます。S2JDBC-Genめちゃくちゃ便利です!

コメントフォーム
Remember personal info

トラックバック:0

このエントリーのトラックバックURL
http://jfut.integ.jp/2008/10/08/s2jdbc-join-names/trackback/
Listed below are links to weblogs that reference
Namesにjoinクエリ用文字列 -> Seasar2.4.30とS2JDBC-Gen 0.9.2で解決 from ふたつの川うるおう日記

Home > Java | Seasar > Namesにjoinクエリ用文字列 -> Seasar2.4.30とS2JDBC-Gen 0.9.2で解決

検索
フィード
メタ情報

Return to page top