読者です 読者をやめる 読者になる 読者になる

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%

本当にこれでよいかはわからない。だれかいい方法があったら教えてください><