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.正
式会員));
*****************************************************************************************
ご確認よろしくお願いします。
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 からこのグループにアクセスしてください。
>
>
確かにエラーメッセージから読み取ると仕様ですね。
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>:
DBFlute-0.9.9.2B-00-SNAPSHOTにて反映しました。
こっちでもテストを追加して確認しました。
でも、FORコメントはList限定だけどね。
(まあ、そっちはindexを使うから)
2011/11/27 awaawa <p1us3i...@gmail.com>:
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 クラスを返すようです。
これは制限でしょうがないものでしょうか。
> 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>: