外だしSQLのIN句でjava.util.HashSet、java.util.EnumSetなどを使うとエラー

1,100 views
Skip to first unread message

awaawa

unread,
Nov 26, 2011, 7:42:35 AM11/26/11
to DBFluteユーザの集い
jfluteさん

awaawaです。

外だしSQLのIN句でjava.util.HashSet、java.util.EnumSetなどを使うとエラーになります。
ConditionBeanではエラーにならないため、外だしSQL固有の問題だと思うのですが。

ConditionBeanだと内部的にArrayListでラップ、またはセットし直していて、
外だしSQLでは、そのような処理をしていないのが原因かもしれません。
(軽く確認しただけなので勘違いかもしれませんが。)
ご確認いただけますか。

***外だしSQL(一
部)*****************************************************************
-- !!Collection<$$CDef$$.MemberStatus> memberStatusCodeList!!

/*IF pmb.memberStatusCodeList != null && !
pmb.memberStatusCodeList.isEmpty() */
and member.MEMBER_STATUS_CODE in /*pmb.memberStatusCodeList*/('FML',
'WDL', 'PRV')
/*END*/
*****************************************************************************************

***ソースコード(一
部)*****************************************************************
// 成功(ConditionBean)
MemberCB cb = new MemberCB();
cb.query().setMemberStatusCode_InScope_AsMemberStatus(EnumSet.of(MemberStatus.
仮会員, MemberStatus.正式会員));
// 成功(ArrayList)
pmb.setMemberStatusCodeList(new
ArrayList<MemberStatus>(EnumSet.of(MemberStatus.仮会員, MemberStatus.正式会
員)));
// エラー(HashSet) The parameter for in-scope condition was not list or
array
pmb.setMemberStatusCodeList(new
HashSet<MemberStatus>(EnumSet.of(MemberStatus.仮会員, MemberStatus.正式会
員)));
// エラー(EnumSet) Failed to invoke the method on the IF comment! Illegal
access to the method: method=public boolean
java.util.RegularEnumSet.isEmpty()
pmb.setMemberStatusCodeList(EnumSet.of(MemberStatus.仮会員, MemberStatus.正
式会員));
*****************************************************************************************

ご確認よろしくお願いします。

kubo

unread,
Nov 26, 2011, 10:05:50 AM11/26/11
to dbf...@googlegroups.com
jfluteです。

awaawaさん、こんばんは

エラーメッセージの通り、バインド変数コメントで
INを使うときはListで、というのが仕様だね。
「The parameter for in-scope condition was not list or array」
(CBはフィルタ処理で間口を広げてると)

単純化のためにも基本的にはリスト使って、
って感じですが、ただ対応するのはそんなに難しくないので、
別件のAbstractSqlClauseの微調整でランタイムを
触るようであれば、やってみようかと。

2011/11/26 awaawa <p1us3i...@gmail.com>:

> --
> このメールは Google グループのグループ「DBFluteユーザの集い」の登録者に送られています。
> このグループに投稿するには、dbf...@googlegroups.com にメールを送信してください。
> このグループから退会するには、dbflute+u...@googlegroups.com にメールを送信してください。
> 詳細については、http://groups.google.com/group/dbflute?hl=ja からこのグループにアクセスしてください。
>
>

awaawa

unread,
Nov 26, 2011, 8:18:08 PM11/26/11
to DBFluteユーザの集い
awaawaです。

確かにエラーメッセージから読み取ると仕様ですね。
CBと同じ動きの方がはまりにくいと思うので、
ぜひ対応お願いします。

On 11月27日, 午前12:05, kubo <dbfl...@gmail.com> wrote:
> jfluteです。
>
> awaawaさん、こんばんは
>
> エラーメッセージの通り、バインド変数コメントで
> INを使うときはListで、というのが仕様だね。
> 「The parameter for in-scope condition was not list or array」
> (CBはフィルタ処理で間口を広げてると)
>
> 単純化のためにも基本的にはリスト使って、
> って感じですが、ただ対応するのはそんなに難しくないので、
> 別件のAbstractSqlClauseの微調整でランタイムを
> 触るようであれば、やってみようかと。
>

> 2011/11/26 awaawa <p1us3inus2...@gmail.com>:

kubo

unread,
Nov 26, 2011, 9:40:58 PM11/26/11
to dbf...@googlegroups.com
jfluteです。

DBFlute-0.9.9.2B-00-SNAPSHOTにて反映しました。
こっちでもテストを追加して確認しました。
でも、FORコメントはList限定だけどね。
(まあ、そっちはindexを使うから)

2011/11/27 awaawa <p1us3i...@gmail.com>:

awaawa

unread,
Nov 28, 2011, 4:46:59 AM11/28/11
to dbf...@googlegroups.com, dbf...@googlegroups.com
awaawaです。

HashSet、うまくいきました。ありがとうございます!

ただ、EnumSet.of(Enum first, Enum... rest)で作成した場合、
isEmpty()がリフレクションでうまくコールできないようです。
※new HashSet<MemberStatus>();だと問題ありませんでした。

・isEmpty
 × org.seasar.framework.beans.factory.BeanDescFactory.getMethod
 × org.seasar.dbflute.helper.beans.factory.DfBeanDescFactory.getMethod

・empty
 ○ org.seasar.framework.beans.factory.BeanDescFactory.getPropertyDesc
 × org.seasar.dbflute.helper.beans.factory.DfBeanDescFactory.getPropertyDesc

※EnumSet.of(Enum first, Enum... rest)は、
定数の数が、64 以下であれば RegularEnumSet クラス、それ以上は JumboEnumSet クラスを返すようです。

これは制限でしょうがないものでしょうか。

kubo

unread,
Nov 28, 2011, 7:03:08 AM11/28/11
to dbf...@googlegroups.com
jfluteです。

> HashSet、うまくいきました。ありがとうございます!
確認ありがとう。

> ただ、EnumSet.of(Enum first, Enum... rest)で作成した場合、
> isEmpty()がリフレクションでうまくコールできないようです。

これびっくりだねー。
RegularEnumSetやJumboEnumSet自体が、
publicじゃないだね。(デフォルトスコープ)
EnumSet経由だと呼べるけど、
リフレクションだと可視性が不正で呼べないんだ。

まあ、やろうと思えば、IfCommentEvaluatorで
publicじゃないもの無理矢理呼べるようにできなくないけど、
それはちょっと今からは絶対にやりたくないねぇ。
パッチ的にEnumSetのサブクラスのときのみ無理矢理呼ぶ、
とかできなくもないけど、まあそこまでやることじゃないかな
ってのと、早急な修正はちょっと避けたいね(後戻りできないので)。
まあ、HashSet使うようにしてください。
というか、基本はListで。

※個人的には、EnumSetって一度も使ったこと無いや...

2011/11/28 awaawa <p1us3i...@gmail.com>:

Reply all
Reply to author
Forward
0 new messages