NonSpecifiedColumnAccessException について

22 views
Skip to first unread message

よし

unread,
May 1, 2020, 12:47:16 AM5/1/20
to DBFluteユーザの集い
お世話になっております、よしです。

現在 seasar2からSpring boot へのコンバートの作業を行っております。
それに伴いDBFluteのバージョンも 1.0.5Nから1.2.2にバージョンアップしております。

この作業の中で1.0.5Nの時は発生していませんでした
「NonSpecifiedColumnAccessException 」
という例外が発生するようになりました。

状況的には
検索時に specify() で、検索対象の項目を限定
その後 dtoMapper で entityからdtoに変換する際にこの例外が発生いたします。

こちら、何か回避方法がございますでしょうか?

よろしくお願いいたします。

kubo

unread,
May 1, 2020, 1:34:47 AM5/1/20
to DBFluteユーザの集い
jfluteです、よしさん、こんにちは。
DBFluteの最新版へのアップグレードありがとうございますう!

> NonSpecifiedColumnAccessException

ふむ、これは...
「SpecifyColumnしてないカラムなのに、Entityでgetしてるよ」
という例外ですね。

> 検索時に specify() で、検索対象の項目を限定
> その後 dtoMapper で entityからdtoに変換する際にこの例外が発生いたします。

なるほど、こういうときに状況と合ってないということです。
いくつか考えられるのが...


<1>
限定的な検索であれば、その検索だけそのチェックをOFFにするという回避策があります。
memberBhv.selectList(cb -> {
cb.disableNonSpecifiedColumnAccess();
});

<2>
チェックの恩恵を受けつつ、DtoMapperだけを回避したいのであれば、
DtoMapperのvmファイルを修正して、Specifyされてるかどうかを判定するようにするとか。

Set<String> specifiedSet = member.myspecifiedProperties();
if (specifiedSet.contains("XXX_COLUMN")) {
member.getMemberAccount();
}

たぶん、SimpleDtoBaseMapper.vm の mappingToDto() のあたりかなと。
ただ、上記のような単純な修正で変な副作用がないか確認が必要ですし、
上記箇所だけの修正とは限らなかったり少し敷居が高めです。

<3>
チェックの恩恵は諦めて、完全にチェックをOFFにしてしまうとか。
littleAdjustmentMap.dfprop にて isNonSpecifiedColumnAccessAllowed を true にします。

<4>
"2" に近いのですが、もうちょい豪快に。
DtoMapperの中で、引数で受け取った Entity は問答無用で .clearSpecifiedInfo() を呼び出すようにすると、
チェックがかからなくなるはずです。

DtoMapperにEntityを入れたら、そのEntityインスタンスは別のところで使われたりしないですよね?
であれば、Specified情報をロストさせてしまっても特に問題はないのかもと。


いま、パッと思い付いたのはこんな感じです。

よし

unread,
May 1, 2020, 5:32:37 AM5/1/20
to DBFluteユーザの集い

jfluteさん、ご回答ありがとうございます。

<1>
限定的な検索であれば、その検索だけそのチェックをOFFにするという回避策があります。
memberBhv.selectList(cb -> {
    cb.disableNonSpecifiedColumnAccess();
});

<3>
チェックの恩恵は諦めて、完全にチェックをOFFにしてしまうとか。
littleAdjustmentMap.dfprop にて isNonSpecifiedColumnAccessAllowed を true にします。


この2つを試してみたのですが、やはり同じエラーとなってしまいます。 

ジェネレートされたソースは
    protected boolean _nonSpecifiedColumnAccessAllowed = false;
から
    protected boolean _nonSpecifiedColumnAccessAllowed = true;
に代わっておりましたので、反映はされているようです。

若干特殊かなと思われる状況は

データベースが AS400のDB2であること
OracleとAS400のDB2の複数に接続する構成にしていることです。

最悪はSpecifyをやめてもいいかなとは思っています。

もし何かわかれば、お願いします。

kubo

unread,
May 1, 2020, 5:42:37 AM5/1/20
to DBFluteユーザの集い
jfluteです

> この2つを試してみたのですが、やはり同じエラーとなってしまいます。

ふむぅ、なぜでしょうね。。。
エラーのスタックトレースを見せてもらってもいいですか?(業務情報は伏せて)



> データベースが AS400のDB2であること
> OracleとAS400のDB2の複数に接続する構成にしていることです。

なるほど。ただ、いまの現状とはあまり関係ないとは思いますが...
複数のDBFluteクライアントがあるのであれば、すべての littleAdjustmentMap.dfprop で設定しないといけないというのはあります。

kubo

unread,
May 1, 2020, 5:44:20 AM5/1/20
to DBFluteユーザの集い
jfluteです

> <1>
> 限定的な検索であれば、その検索だけそのチェックをOFFにするという回避策があります。
> memberBhv.selectList(cb -> {
> cb.disableNonSpecifiedColumnAccess();
> });

ごめんなさい、一つは間違ってました。逆でした。

enableNonSpecifiedColumnAccess()

を呼び出します。
(アクセスできるようにする、というニュアンスですね)

kubo

unread,
May 1, 2020, 6:03:31 AM5/1/20
to DBFluteユーザの集い
jfluteです

一応、こちらで簡単にテストコードを書いて動作確認してみたのですが...

https://github.com/dbflute-test/dbflute-test-active-hangar/commit/bc6edc9b0a19210420fae3261ae1aae3980e3b6f

disable じゃなくて enableNonSpecifiedColumnAccess(),
そして、isNonSpecifiedColumnAccessAllowed=true で mappingToDto() が呼べるようになりました。

まず、そちらの環境でも、このテストケースと似たようなテストが通るでしょうか?
レアケースで落ちている可能性もあるので、小さなモデルで確認してみると良いかと思います。

よし

unread,
May 2, 2020, 10:13:46 AM5/2/20
to DBFluteユーザの集い
よしです。

いけました!

ありがとうございます。

enableNonSpecifiedColumnAccess() を設定するパターン

isNonSpecifiedColumnAccessAllowed=true を設定するパターン

どちらもいけました。

前回 isNonSpecifiedColumnAccessAllowed=true がダメだったのは
disableNonSpecifiedColumnAccess を設定したままだったからですね。

今回は、enableNonSpecifiedColumnAccess()を設定するパターンで対応しようと思います。

ご対応ありがとうございました。

kubo

unread,
May 2, 2020, 10:29:55 AM5/2/20
to DBFluteユーザの集い
jfluteです

よしさん、確認ありがとうございますー。

> 今回は、enableNonSpecifiedColumnAccess()を設定するパターンで対応しようと思います。

良かったです。

本当は、DBFlute本体でDtoMapperで対応しないといけないところですが、取り急ぎその方法でお願いします。
Reply all
Reply to author
Forward
0 new messages