[Seasar-user:3581] Re: S2Dao のSQLコメントについて

suga [E-MAIL ADDRESS DELETED]
2006年 5月 2日 (火) 08:50:40 JST


suga です。

On 5/2/06, Momotaro Nishiumi <[E-MAIL ADDRESS DELETED]> wrote:
> > /*IF dto.field1 != null*/field1 = /*dto.field1*/'001' /*END*/
> > /*IF dto.field2 != null*/AND field2 = /*dto.field2*/'001' /*END*/
> > /*IF dto.field3From != null*/AND field3 >= /*dto.field3From*/1/*END*/
> > /*IF dto.field3To != null*/AND field3 <= /*dto.field3To*/1/*END*/
> これだと、dto.field1がnullだった場合にSQLエラーになってしまいます。

field1が、というよりも、全部の条件がない場合に "WHERE" だけに
なってしまうということですね。


QUERY アノテーションに /*BEGIN*/WHERE を書けるようにするのは
いかがでしょうか >S2Dao コミッタの方々

/*BEGIN*/ に空白を含められたかどうかわかりませんが、
ORDER BY と同様に "QUERY アノテーションの先頭に" という
条件であれば、簡単な実装として下記で動作します。

------------------------
org.seasar.dao.impl.DaoMetaDataImpl

    protected SelectDynamicCommand createSelectDynamicCommand(
            ResultSetHandler resultSetHandler, String query) {

        SelectDynamicCommand cmd = createSelectDynamicCommand(resultSetHandler);
        StringBuffer buf = new StringBuffer(255);
        if (startsWithSelect(query)) {
            buf.append(query);
        } else {
            String sql = dbms_.getAutoSelectSql(getBeanMetaData());
            buf.append(sql);
            if (query != null) {
                if (startsWithOrderBy(query)) {
                    buf.append(" ");
// ここから
                } else if (query.matches("(/\\*BEGIN\\*/)?WHERE .+")) {
                    buf.append(" ");
// ここまで追加
                } else if (sql.lastIndexOf("WHERE") < 0) {
                    buf.append(" WHERE ");
                } else {
                    buf.append(" AND ");
                }
                buf.append(query);
            }
        }
        cmd.setSql(buf.toString());
        return cmd;
    }
--------------------------------


--
suga ( [E-MAIL ADDRESS DELETED] )



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