たぷつきません

おなかがでてきた。もうたぷついてるやん。

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してますので仕方ないけど、なんだかメソッド太っちゃったな。ヌル条件で引っ掛けるの辛いですね……(;_;

みんなも気をつけてー。 > うちのプロジェクトチーム