データベースからのフェッチ済みEOに対して、検索を行ったときにWebObjectsの問題と思われる例外が発生したので報告します。データは EOEditingContext.objectsForEntityName()等で NSArray に取得済みとします。ここで以下のように検索を行うと、例外が発生します。ここで、nameという文字列属性を持つ物とします。
NSArray eoArray =
session().defaultEditingContext().objectsForEntityName("First")
EOQualifier qual = new EOKeyValueQualifier( "name",
EOQualifier.QualifierOperatorCaseInsensitiveLike, "*ABC[*" );
NSArray resultArray =
EOQualifier.filteredArrayWithQualifier( eoArray, qual );
エラーは以下のようなもの
Error:
java.lang.IllegalArgumentException: Bad pattern *ABC[*for qualifier
Reason:
Bad pattern *ABC[*for qualifier
java.lang.IllegalArgumentException: Bad pattern *ABC[*for qualifier
at
com.webobjects.foundation._NSStringUtilities._bracketedStringFromPatternAnalyzer
(_NSStringUtilities.java:740)
at
com.webobjects.foundation._NSStringUtilities.stringMatchesPattern
(_NSStringUtilities.java:785)
at
com.webobjects.eocontrol.EOKeyValueQualifier.evaluateWithObject
(EOKeyValueQualifier.java:141)
at
com.webobjects.eocontrol.EOAndQualifier.evaluateWithObject
(EOAndQualifier.java:96)
at
com.webobjects.eocontrol.EOQualifier.filteredArrayWithQualifier
(EOQualifier.java:632)
:
:
つまり、[はなんらかのパターンマッチングのために使われていて、それが閉じられていないのが原因のようだ。"[]"と閉じると例外は発生しない。"\["と円マークでエスケープしても例外発生。[を含む文字列を検索できていない。
この方法はメモリー上にフェッチした後で検索するいずれの方法でも同じようだ。確認したのは WODisplayGroupのsetQualifier()でEOQualiferを設定した場合。
では、解決方法は?今のところ、文字列をlike検索する場合、EOEditingContext上での操作を諦める他ないと思われる。ただし、同じ文字列をDBに対して行う場合にはこれはうまくゆく。
EOQualifier qual = new EOKeyValueQualifier( "name",
EOQualifier.QualifierOperatorCaseInsensitiveLike, "*ABC[*" );
NSArray resultArray =
session().defaultEditingContext().objectsWithFetchSpecification(
new EOFetchSpecification( "First", qual, null ) );
Mac OS X 10.3.9+WO5.2.3
posted by 永遠製作所 at 02:13| 東京 ☁|
Comment(0)
|
TrackBack(0)
|
WebObjects
|

|