Grailsのcriteriaでlikeにescapeを指定する
どうも見つからない。
いろいろ探してたらorg.hibernate.criterion.LikeExpressionなるものを発見したがorg.hibernate.criterion.Exampleで使われているくらいで他に使われていない。なんぞこれ。
とりあえず、これを使おう。LikeExpressionはコンストラクタがprotectedだがgroovyの前では、そんなものは飾りにすぎない。
Domain1.withCriteria { add new LikeExpression("value", "x@_x", MatchMode.ANYWHERE, '@' as char, false) addToCriteria new LikeExpression("value", "x@_x", MatchMode.ANYWHERE, '@' as char, false) }
withCriteria内で動いているbuilderはCriteriaBuilderのようだけど、invokeMethodとかで適当にcriteria側にディスパッチして動いてくれる模様。addToCriteriaでも同じようにいけた。addToCriteriaもprotectedで非常にあれではあります。
動作させたときのSQLログ
2012-11-13 22:44:13,322 [main] DEBUG hibernate.SQL - /* criteria query */ select this_.id as id4_0_, this_.version as version4_0_, this_.value as value4_0_ from domain1 this_ where this_.value like ? escape '@' and this_.value like ? escape '@' 2012-11-13 22:44:13,327 [main] TRACE sql.BasicBinder - binding parameter [1] as [VARCHAR] - %x@_x% 2012-11-13 22:44:13,341 [main] TRACE sql.BasicBinder - binding parameter [2] as [VARCHAR] - %x@_x%
本当にこれでよいかはわからない。だれかいい方法があったら教えてください><