S2DAOの仕様はむずい…
こんなARGSアノテーションを入れたコマンドがありまして、この3つの項目はセットでユニークキーとなっています。
public static final String getHtmlTemplate_ARGS = "PAGE_SET_ID,PAGE_KIND,CATEGORY_ID"; public PageTemplate getHtmlTemplate(int pageSetId, short pageKind, Long categoryId);
この第3パラメータのカテゴリIDは、pageKindという種別が「カテゴリページ」という意味を示す値の時のみ必要になっています。カテゴリページは共通ページ(categoryIdはnull)と、個別ページというのがあります。
…という前提なのですが、困った現象が起きていました。別の場所でリストアップして(これはOK)、リストアップしたオブジェクト1つ1つを読み出す処理を入れたところ、categpryIdがヌルのレコードが読み出せず、ヌル以外のレコードをどうしても取得してしまうのです。
しばらくは他の原因を追ってたんですが、getHtmlTemplate メソッドが返すエンティティに原因があることに辿り着きました。categoryIdにヌルを渡しているのに返ってくるエンティティのcategoryIdはなんとヌル以外のレコードが返ってきていたのです。
そこでようやくピーンと来ました。S2DAOの動作(仕様と思われ)的にはcategoryIdにnull を指定したら、パラメータそのものが無効でwhere句に入らないんじゃないかと。
ちょっと「えぇ〜っ!」という感じです。だって、そもそもパラメータ無視したいなら、オーバーロードメソッド…
public static final String getHtmlTemplate_ARGS = "PAGE_SET_ID,PAGE_KIND"; public PageTemplate getHtmlTemplate(int pageSetId, short pageKind);
…が別途あるだけで良くないですか?結局CATEGORY_IDがnullの条件を引っ張るにはQUERYアノテーションを使わなければならない様子。結局次のように書き直しましたが、なんかスマートじゃない気がするのは私だけでしょうかね?
public static final String getHtmlTemplate_ARGS = "PAGE_SET_ID,PAGE_KIND,CATEGORY_ID"; public static final String getHtmlTemplate_QUERY = "" + "PAGE_TEMPLATE.PAGE_SET_ID = /*PAGE_SET_ID*/0 and\n" + "PAGE_TEMPLATE.PAGE_KIND = /*PAGE_KIND*/0 and\n" + "/*IF CATEGORY_ID != null */ PAGE_TEMPLATE.CATEGORY_ID = /*CATEGORY_ID*/0\n" + " -- ELSE PAGE_TEMPLATE.CATEGORY_ID is null\n" + "/*END*/"; /** * */ public PageTemplate getHtmlTemplate(int pageSetId, short pageKind, Long categoryId);
って、QUERYアノテーションも上記になるまで2〜3度問題が…、項目名だけだと「曖昧」とDBMSに怒られ、PAGE_TEMPLATE.を付けました。けっこうJOINしてますので仕方ないけど、なんだかメソッド太っちゃったな。ヌル条件で引っ掛けるの辛いですね……(;_;
みんなも気をつけてー。 > うちのプロジェクトチーム