Итак, у меня есть класс домена grails:
class Message
{
Inbox inbox
Boolean hasBeenLogicallyDeletedByRecipient
...
static belongsTo = [
inbox:Inbox,
...
]
static constraints = {
hasBeenLogicallyDeletedByRecipient(nullable:false)
...
}
}
Я хотел бы использовать динамический искатель следующим образом:
def messages = Message.findAllByInboxAndHasBeenLogicallyDeletedByRecipient(
inbox, false, [order:'desc',sort:'dateCreated'])
Это прекрасно работает при выполнении модульного теста в STS2.6.0.M1 против грааля 1.2.1;При раскрутке веб-приложения происходит сбой из-за By в hasBeenLogicallyDeletedByRecipient (я предполагаю, что при создании запроса он запутал динамический анализатор поиска).* Я могу использовать построитель критериев, который работает в приложении:
def messages = Message.withCriteria {
and {
eq('inbox', inbox)
eq('hasBeenLogicallyDeletedByRecipient', false)
}
order('dateCreated', 'desc')
}
Но поскольку withCriteria
не проверяется, он не работает сразу в модульных тестах, поэтому я мог бы добавить следующее в модульtest:
Message.metaClass.static.withCriteria = { Closure c ->
...
}
Является ли критерий / юнит-тестирование наилучшим / принятым подходом?Я не чувствую себя вполне комфортно с этим, потому что это обходит тестирование критериев закрытия.
В идеале, я бы предпочел использовать динамический искатель - есть ли краткий способ заставить его работать как есть?Если нет никакого способа обойти это, я предполагаю, что имя поля может быть изменено (есть причина, почему я не хочу этого делать, но это не имеет отношения к вопросу) ...
ОБНОВЛЕНИЕ:
Вот трассировка стека, когда я пытаюсь использовать findAllByInboxAndHasBeenLogicallyDeletedByRecipient()
внутри приложения - обратите внимание, как получается получить последние К и обработатьвсе остальное между ним и findAll как свойство.Я пас на http://grails.org/OperatorNamesInDynamicMethods, но в нем ничего не говорится о К верботену.
org.codehaus.groovy.grails.exceptions.InvalidPropertyException: No property found for name [byInboxAndHasBeenLogicallyDeleted] for class [class xxx.Message]
at xxx.messages.yyyController$_closure3.doCall(xxx.messages.yyyController:53)
at xxx.messages.yyyController$_closure3.doCall(xxx.messages.yyyController)
at java.lang.Thread.run(Thread.java:662)