[Seasar-user:8895] Re: [DBFlute] 動的にSQLを生成する方法 ★訂正

kubo [E-MAIL ADDRESS DELETED]
2007年 7月 2日 (月) 23:07:51 JST


久保です。

> (1)Like検索のOR条件ですが複数テーブルを連結して取得する場合
> 
> select tbl1.col1
> from tbl1
>  inner join tbl2 on
>    tbl1.col3=tbl2.col3
> where col2 like '%A%'
> union
> --↓ここのSQLは基本的に最初のSQLと同じケース(likeの条件のみ違う)
> select tbl1.col1
> from tbl1
>  inner join tbl2 on
>    tbl1.col3=tbl2.col3
> where col2 like '%B%'

こちら以下のように記述することが可能です。

【BOOK】(本)
BOOK_ID (PK)
BOOK_NAME
AUTHOR_ID (FK)
PUBLISHER_ID (FK)

【AUTHOR】(著者)
AUTHOR_ID (PK)
AUTHOR_NAME

【PUBLISHER】(出版社)
PUBLISHER_ID (PK)
PUBLISHER_NAME

  ex) 本一覧検索:本の名前のLike検索のUNIONで、著者と出版社も同時に取得したい

    final String[] parameters = new String[]{"S2Dao", "DBFlute", "Torque"};
    final BookCB cb = new BookCB();
    cb.setupSelect_Author();    // ★著者を結合してSelect句に指定
    cb.setupSelect_Publisher(); // ★出版社を結合してSelect句に指定
    final LikeSearchOption option = new LikeSearchOption();
    option.likeContain();
    BookCB unionCB = null;
    for (String parameter : parameters) {
        if (unionCB == null) {
            cb.query().setBookName_LikeSearch(parameter, option);
            unionCB = new BookCB();
            continue;
        }
        unionCB.query().setBookName_LikeSearch(parameter, option);
        cb.union(unionCB.query());
    }

  ex) 本一覧検索:親テーブルの出版社の名前のLike検索のUNIONで、著者と出版社も同時に取得したい

    final String[] parameters = new String[]{"Seasar", "JFlute", "Apache"};
    final BookCB cb = new BookCB();
    cb.setupSelect_Author();    // ★著者を結合してSelect句に指定
    cb.setupSelect_Publisher(); // ★出版社を結合してSelect句に指定
    final LikeSearchOption option = new LikeSearchOption();
    option.likeContain();
    BookCB unionCB = null;
    for (String parameter : parameters) {
        if (unionCB == null) {
            cb.query().queryPublisher().setPublisherName_LikeSearch(parameter, option);
            unionCB = new BookCB();
            continue;
        }
        unionCB.query().queryPublisher().setPublisherName_LikeSearch(parameter, option);
        cb.union(unionCB.query());
    }


> (2)Like検索のOR条件で、さらにUNIONで結合されるサブSQLが異なる場合
> 
> select col1
> from tbl1.tbl1
>  inner join tbl2 on
>    tbl1.col3=tbl2.col3
> where col2 like '%A%'
> union
> --↓ここのSQLは基本的に最初のSQLと異なるケース
> select tbl4.col1
> from tbl4
>  inner join tbl5 on
>    tbl4.col3=tbl5.col3
> where col2 like '%B%'

こちらは残念ながらできません。
ConditionBeanのunionは、「基点となるTableが同一Table」という制約があります。
戻り値が自動生成されたEntityである以上、独自の形式のSelect句を
構成することはできないためです。

この場合、外だしSQLを利用したいところですが、
Bind変数が不定数の場合だと、やはりできないというところです。



「2」に関しては、やはり悩みます。

> 例えば XXXXDaoクラスに
>     public Entity[] dynamicXxxSql(String sql, List condition);
> 
> のようなメソッドを追加すれば、引数の1つ目がプログラムで生成したSQL
> 2つ目の引数をリストで渡せば、PreparedStatementのパラメタにセットしてくれる
> ようなことはできませんか?
> 
> 既にこのようなことが可能でしたらその方法を教えていただけませんでしょうか?
> また、もし、現在そのような仕組みが無いようでしたら
> 要望として挙げさせていただきたいです。

も、今検討中です。

「ConditionBeanでできないことは外だしSQLにすれば良い」というのが通じない
パターンがまさしく今回で(不定数に関しては逆にConditionBeanでないと実現もできない)、
自分も実業務で困ったことがあるためどうにかしたいのですが、
あまりやり方を増やして利用方法が煩雑になるのも避けたいとも考えています。
(ちょっと考えさせてください)





Seasar-user メーリングリストの案内