Por que findAllBy * falhar quando usando três condições em Grails / GORM?
Pergunta
Considere os seguintes usos do método finder dinâmica Grails / GORM findAllBy *:
def foo1 = Foo.findAllByYear(yyyy)
def foo2 = Foo.findAllByMonth(mm)
def foo3 = Foo.findAllByDay(dd)
def foo4 = Foo.findAllByYearAndMonth(yyyy, mm)
def foo5 = Foo.findAllByYearAndDay(yyyy, dd)
def foo6 = Foo.findAllByYearAndMonthAndDay(yyyy, mm, dd)
println "# foo1=${foo1.size()} foo2=${foo2.size()} foo3=${foo3.size()}"
println "# foo4=${foo4.size()} foo5=${foo5.size()} foo6=${foo6.size()}"
O primeiro cinco destes usos localizador dinâmico funciona como esperado.
No entanto, o sexto falha com um InvalidPropertyException ( "No imóvel encontrada para o nome [yearAndMonth] para a classe [classe foo]").
Pergunta:
Por que o sexto trabalho de um? não é findAllBy * capaz de lidar com mais de duas condições? Solução / trabalho-around?
Solução
A resposta de Ted é correto, mas a razão por Grails não suporta mais de 2 predicados é porque se todas as conjunções não são os mesmos, então não está claro o que a intenção é.
Ou na planície Inglês ...
- É óbvio que significa
findAllByYearAndMonthAndDay(1999,2,3)
- É também óbvio o que significa
findAllByYearOrMonthOrDay(1999,2,3)
- Mas não é óbvio o que significa
findAllByYearOrMonthAndDay(1999,2,3)
No entanto, se todas as conjunções são o mesmo (todos and
s ou todos or
s), então não há nenhuma razão para que mais de 2 predicados não poderia ser suportada. Na verdade, se você pesquisar na Grails JIRA você vai encontrar lá já é uma questão em aberto para isso. Vote para ele se você se sentir fortemente sobre ele.
Incidentalmente, o plug-in Intellij Grails erroneamente fornece conclusão de código para localizadores dinâmicas com mais do que 2 predicados.
A solução / solução é simplesmente escrever uma consulta Criteria ou usar HQL vez.
Outras dicas
Não, não atualmente. É limitado a 2 condições no momento. Por mais de 2 olhada os critérios Builder ou os métodos findAllWhere.