DBFlute-1.1からはNonSpecifiedチェック

ちょっとややこしい話ですが...

SpecifyColumnって機能があります。
まず、これがわからないとこの話意味がわからないかと。

ConditionBeanでの検索は、
「基点テーブルに対して、何のあ関連テーブルを取得するか?」

っていう感じで、SetupSelectをしますが、
基点テーブル、および、SetupSelectされた関連テーブルの、
すべてのカラムが取得対象になります。
つまり、SQLのselect句にすべてのカラムが列挙されます。

テーブルは選択式だけど、
カラムはデフォルトで全部列挙でハイブリッドな感じ。
すべての検索でカラムまで全部指定していると、
それはそれで開発効率を下げてしまうからです。
(あれ取ってる?取ってないっけ?だらけになる)

ただ、SpecifyColumnを使うと、
select句に列挙するカラムを指定することができて、
「このカラムとこのカラムだけ欲しいー」
ってのが実現できます。
パフォーマンス考慮のためですね。

SpecifyColumnを知らない方はこちらへ
 => SpecifyColumn | DBFlute
memberBhv.selectList(cb -> {
    cb.setupSelect_MemberStatus();
    cb.specify().columnMemberStatusName();
    ...
}).forEach(member -> {
    member.getMemberStatus().alwaysPresent(status -> {
        ... = status.getMemberStatusName(); // OK
        ... = status.getDisplayOrder(); // *null
    });
});

絞ったけどgetしたらnull

ということで、SpecifyColumn を使うと、
やっぱり「あれ取ってる?取ってないっけ?」に
なってしまう可能性があります。

Entity から get すると null が戻ってきます。
これは、データがないから null なのか?
それとも、SpecifyColumnを使ってSpecifyされてない
から null なのか?

ぱっとわからずにデバッグに時間が取られてしまう
可能性があります。だからまあ、デフォルトでは、
Entityのカラムはすべて充足させているわけです。

フィードバックありがとうございます。

そこで、Twitter上でつぶやき頂きました!

【引用】
「selectしてない(setterが呼ばれてない)列をgetしたら、
例外に出来ないかな〜 #dbflutehttps://twitter.com/tty_twt/status/520732871804215296

ありがとうございます。
こういった何気ないフィードバックがDBFluteの糧です。

実現できるか不安でしたが、やってみました。
やるなら1.1のこのタイミングしかない。(1.0.xには入れない)

...
...

でーきたー

できました。
昨今の缶詰生活が実りました。

SpecifyColumnを使っているテーブルで、
SpecifyされていないカラムをEntityでgetしたら、

例外!

エラーメッセージは相変わらずド派手です。
memberBhv.selectList(cb -> {
    cb.setupSelect_MemberStatus();
    cb.specify().columnMemberStatusName();
    ...
}).forEach(member -> {
    member.getMemberStatus().alwaysPresent(status -> {
        ... = status.getMemberStatusName(); // OK
        ... = status.getDisplayOrder(); // *NG: exception
    });
});

デフォルトにした

で、これをデフォルトにするかどうかを迷いました。
EntityからWeb用のBeanへの詰め替え処理などを、
再利用しているような場合に...
あっちの検索では通るけど、あっちからだと落ちるみたいな。
getterを呼んで null じゃなかったら詰め替えるみたいな。

そういう可能性がなきにしもあらずです。
だからこそ、1.0.xでは絶対にデフォルトONはできない。

なので、デフォルトにするなら今しかない。
新しいプログラムでの心配に集約できますが、
そのケースで実装ができないのはちょっと不便ではあります。

ですが、ConditionBeanの検索時にオプションでOFFにできて、
エラーメッセージがド派手であれば、いざそういう実装しようと
思った方も、うまく回避でしょうと。
やはり、Strict な Java8 の DBFlute なので、
ここは頂いたアイディアをしっかり活用したいなと思います。

ちなみに、これで Scala 版で心配していた、
「SpecifyされてないのにOptionじゃなくてnull戻っちゃう問題」
も、そもそもgetしたら例外ということで解決ができました。

もちろん、dfpropで全体的にOFFにすることもできます。

littleAdjustmentMap.dfprop にて、

isNonSpecifiedColumnAccessAllowed = true

にすれば、NonSpecified な Column ヘの Access が、
Allowed です。(許されます)

...
...

って、実現はできたけど厳密テストはこれからなので、
まだ何かあるかもですけど(^^

…

…

【追記】
1.0.x系でも入りましたー!

// DBFlute-1.0.5M Released
http://d.hatena.ne.jp/jflute/20141031/release105m