Erro com criteria
15/02/2015 05:01
0
Olá moçada, estou com o seguinte problema, dentro do meu controller criei uma action que retorna uma busca utilizando "findAll", porém não estou conseguindo criar a paginação através dele, pesquisando na internet vi alguns comentários dizendo que não é possível retornar um "contador" para o paginate na view utilizando "findAll" pq ele gera um "arrayList", li uma matéria mt bacana do KICO sobre criterias e depois vi que a paginação através dela é bem mais tranquilo e tentei utilizar, porém ao criar minha criteria conforme código abaixo a variável "testeCriteria" retorna o erro: "Cannot assign 'HibernateCriteriaBuilder' to 'Object'" sendo que eu estou referenciando a classe do meu domínio corretamente:

Class ExemploController{
....demais métodos.....

def buscaExemplo() {


def var1Selecionado = params.tipo_exemplo ?: '1'
def var2Selecionado = params.tipo_esp ?: '71'

if(condição do if){
Aqui ocorre o erro
def testeCriteria = Exemplo.createCriteria()
def query = testeCriteria.list{
....código da criteria....
}

Essa é a consulta com findAll que funciona mas não consegui paginar os resultados

if(condição do if){
def espVar = var2Selecionado.toLong()
def espSel = Esp.findById(espVar)
def query = Exemplo.findAll("from Exemplo as p where p.espM1=? or p.espM2= ?", [espSel,espSel],[max:10,offset:0])
render(view: 'espresultados', model: [exemploInstanceList: query, exemploInstanceCount: query.count])

}else {
def prestVar = var1Selecionado.toLong()
def prestSel = TipoExemplo.findById(prestVar)
def query2 = Exemplo.findAll("from Exemplo as p where p.tipoExemplo=?",[prestSel])
render(view:'espresultados', model: [exemploInstanceList: query2, exemploInstanceCount: query2.count])
}

}
}

Desde já agradeço pela força!
Tags: paginação, criteria, findall


0
Na documentação você vai ver que o método list() do createCriteria pode receber alguns parâmetros, no seu caso max e offset, e que ao usar isso ele lhe retorna um PagedResultList, que possui 2 métodos bastante úteis list() e totalCount().

params.max = Math.min(params.max?.toInteger() ?: 10, 100)
params.offset = params.offset ? params.offset.toInteger() : 0

def criteriaExemplo = Exemplo.createCriteria()
def resultado = criteriaExemplo.list(params) { //... }
log.debug "${resultado.properties}"


0
Olá Carlos, vlw pelo esclarecimento na paginação através do método list, mas e em relação ao erro apontado na declaração def testeCriteria = Exemplo.createCriteria() em que a variável "testeCriteria" retorna o erro: "Cannot assign 'HibernateCriteriaBuilder' to 'Object'" sendo que eu estou referenciando a classe do meu domínio(Exemplo)corretamente, sabe o que pode ser? Grato pela ajuda.
20/02/2015 10:31


0
Ola, francisco. Muito estranho isso, cara.
Até onde eu sei

def testeCriteria = Exemplo.createCriteria()

é equivalente a

Object testeCriteria = Exemplo.createCriteria()


A partir da mensagem de erro
"Cannot assign 'HibernateCriteriaBuilder' to 'Object'"
, acho que o groovy não esta conseguindo associar uma instancia de HibernateCriteriaBuilder, que é a classe retornada pelo metodo createCriteria(), a uma variavel do tipo Object.
Isso é realmente estranho pois em tese todo Objeto java/groovy é instancia de Object.

Uma possivel solução pode ser substituir a linha acima por:

HibernateCriteriaBuilder testeCriteria = Exemplo.createCriteria()


Abraço
21/02/2015 12:30


0
Olá Yago, vlw pela sugestão, realmente com a declaração explícita do HibernateCriteriaBuilder e a inclusão do import grails.orm.HibernateCriteriaBuilder funcionou, é estranho pq vi no post do Kico que ele diz: "Toda classe de domínio do Grails possui injetada a função createCriteria, que retorna um objeto do tipo grails.gorm.HibernateCriteriaBuilder." E nos exemplos que ele passa um simples "def" da vida resolve, mesmo assim vlw pela ajuda!
25/02/2015 15:27



Ainda não faz parte da comunidade???

Para se registrar, clique aqui.


Aprenda Groovy e Grails com a Formação itexto!

Newsletter Semana Groovy

Assinar

Envie seu link!


Livro de Grails


/dev/All

Os melhores blogs de TI (e em português) em um único lugar!

 
Creative Commons
RSS Grails Brasil é mantido por itexto Consultoria.
Em caso de problemas contacte Henrique Lobo Weissmann (Kico) por e-mail: kico@itexto.com.br
Todo o conteúdo presente neste site adota o Creative Commons como licença padrão.
Ver: 4.14.0
itexto