Grails Gorm ссылается на значение свойства (столбца) в именованном запросе?

Итак... Есть ли способ сделать что-то подобное?

class Kitty {
    String name
    String nickName
    public static String getExpectedNickname(String name) {
        return name.replaceAll('Mr. ', '')
    }
    static namedQueries = {
        byKityWithPredictableNickname {
            ilike 'name', '%Kitty%'
            ilike 'nickName', Kitty.getExpectedNickname('name')
        }
    }
}

Могу ли я как-то ссылаться на значение значения столбца текущей строки? Я думал, что свойство('имя') сработает, но, увы, нет.

ИЗМЕНИТЬ:

Другой пример: я думал, что-то подобное сработает... но это не так :(...

static namedQueries = {
    whyDoesntThisReturnEverything {
        int c = Kitty.bySubQuery(id).count() //returns everything when I put "1" instead of "id"
        c == 1
    }
    bySubQuery { Long paramId ->
        eq 'id', paramId
    }
}

Вместо этого я получаю какое-то глупое исключение с недопустимым аргументом:

java.lang.ClassCastException@2af65a43. Stacktrace follows:
Message: java.lang.ClassCastException@2af65a43
    Line | Method
->>   -1 | invoke                                in sun.reflect.GeneratedMethodAccessor327
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
|     43 | invoke                                in sun.reflect.DelegatingMethodAccessorImpl
|    606 | invoke . . . . . . . . . . . . . . .  in java.lang.reflect.Method
|   1254 | jlrMethodInvoke                       in org.springsource.loaded.ri.ReflectiveInterceptor
|     90 | invoke . . . . . . . . . . . . . . .  in org.codehaus.groovy.reflection.CachedMethod
|     57 | getProperty                           in groovy.lang.MetaBeanProperty
...

person SnoopDougg    schedule 17.10.2014    source источник


Ответы (1)


Я думаю, что единственный способ сделать это через sqlRestriction.

//...
static namedQueries = {
    findAllKitty {
        ilike 'name', '%Kitty%'
    }

    findAllByNickNameLikeName {
        sqlRestriction "nick_name like '%' || replace(name, 'Mr. ', '') || '%' "
    }
}

//to use:
Kitty.findAllByNickNameLikeName().list()

Синтаксис SQL, вероятно, изменится в зависимости от используемой вами базы данных.

person Victor    schedule 20.10.2014
comment
Я не уверен, что понимаю... Почему у вас есть все ('%') или два раза? И не заменит ли вернуть строку, а не логическое значение? Я отредактировал свой исходный вопрос, добавив дополнительный пример того, что, как я надеялся, сработает. - person SnoopDougg; 20.10.2014
comment
В соответствии с вашим примером вам нужны все объекты, которые nickName ilike name (- 'Mr. '), и это то, что делает namedQuery findAllByNickNameLikeName. Я просто поставил '%' в качестве примера, но и следующее тоже будет работать: sqlRestriction "nick_name like replace(name, 'Mr. ', '')" - person Victor; 20.10.2014