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?

Foi útil?

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 ands ou todos ors), 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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top