Consulta Query Hibernate

14 respostas
java
F

Pessoal bom dia,
como faço essa consulta via query hibernate? Esse log veio do próprio hibernate mas ao tentar realizar dá erro!

select
listamemor0_.computador_id as computad1_4_0_,
listamemor0_.memoria_id as memoria_2_4_0_,
memoria1_.id as id1_12_1_,
memoria1_.ativa as ativa2_12_1_,
memoria1_.capacidade as capacida3_12_1_,
memoria1_.pentes as pentes4_12_1_,
memoria1_.tag as tag5_12_1_,
memoria1_.tipo as tipo6_12_1_,
memoria1_.totalmemoria as totalmem7_12_1_
from
Computador_Memoria listamemor0_
inner join
Memoria memoria1_
on listamemor0_.memoria_id=memoria1_.id
where
listamemor0_.computador_id=?

14 Respostas

D

Qual erro? Quais são as classes?

F

Uma classe Computador que tem uma lista de memorias

@OneToMany(cascade=CascadeType.ALL)

@JoinTable(name=Computador_Memoria,joinColumns=@JoinColumn(name=computador_id),inverseJoinColumns=@JoinColumn(name=memoria_id) )

@XStreamImplicit(itemFieldName=memoria)

private List listaMemoria = new ArrayList();
F

Explicando melhor o problema.
Tenho uma tela com uma lista de computadores representados em uma datatable via componente JSF PRIME com filtros ect…Porém, após filtrar um computador aleatório e clicar nele para expandir e ver os objetos contidos, como lista de memórias, etc… recebo o famoso lazyexception!!!O servidor Wildfly, como manipula as transações fecha a bagaça da conexão,mas esquece de abrir de novo…
Um saco pé no saco, a gambiarra que encontrei para resolver isso é fazer uma nova consulta, ou seja dar um um novo find!!! Mas a meu ver é uma puta gambiarra, alguém sabe uma forma mais inteligente de resolver isso?

J

Usa HQL com fetch join para retornar o resultado completo enquanto a conexão estiver aberta. Query via lazy não é eficiente, gera n querys.

F

Grato pela resposta,
Realmente, essa solução é a mais citada.
Você sugere que coloque em cada método essa consulta HQL, tipo um

select c from computador join fech c.listaMemorias

public Class ComputadorDAO{

public Collection  listarMemorias(Computador computador){

return computador.getListaMemoria();

}

public Collection listarDiscos(Computador computador) {

return computador.getListaDiscos();

}

//OUTRAS LISTAS

}

J

Pode ser, mas se oriente por funcionalidade. Se o usuário terá consultas separadas de memórias e discos, crie duas querys. Se for um relatório com memórias, discos, etc, faça apenas 1 query que atenda esse resultado.

F

Como seria essa consulta em HQL? Até pq os relacionamentos nao sao bidirecionais.

J

Vai depender do mapeamento estar correto:

from Computador as c
join fetch c.listaMemoria

Aqui tem alguns exemplos: https://docs.jboss.org/hibernate/orm/3.3/reference/pt-BR/html/queryhql.html

F

Bom dia,
Desculpas, como assim, correto? O mapeamento é bem simples tenho um PC que tem listas de memórias, HDs, ect…vários componentes, tudo unidirecional. Pois não há necessidade que cada componente tenha acesso ao seu computador. A questão é que dessa forma, essa sua consulta não vai funcionar.

J

Não é pra copiar o que fiz, foi só um exemplo ilustrativo de join com uma lista, baseado no link que te passei. Estude essa documentação e faz o HQL de acordo com suas necessidades. Isso é um capítulo a parte, a questão é que HQL resolverá o problema de lazy.

F

Amigo, se precisasse estudar a documentação não estaria entrando aqui no FORUM solicitando ajuda.

J

Como vai usar um recurso complexo desses sem parar pra estudar? E tem que começar do mais simples e ir avançando, seguindo algum material de ensino. Quando tiver uma dúvida mais pontual é só postar. Da mesma forma que você reportou pontualmente sobre o problema do lazy com a conexão fechada sem seu controle, uma dica foi usar HQL retornando a consulta totalmente pronta. Já ensinar HQL ou realizar a prestação de serviço pra uma demanda aqui no fórum, pelo menos eu não faço isso.

F

São duas coisas distintas, você está fazendo confusão. Esse fórum, posso estar errado, foi crido com esse intuito, ou seja, de compartilhar conhecimento e ajudar que está com dificuldades. Recomendar alguém a estudar é passível quando esse alguém pede uma orientação do zero, ou seja quando é evidente que essa pessoa não quer se dar o trabalho de quebrar a cabeça, que não é o meu caso. Esse tipo de resposta, é desrespeitosa, haja vista que não pedi para resolver o meu problema. O melhor a se fazer, nesse tipo de situação, é ser honesto, responder que também não sabe, ao invés de simplesmente mandar a pessoa que está com dificuldade estudar. Na real é até arrogante de sua parte e bem imaturo, este fórum foi criado para ajudar as pessoas e não para destilar ódio ou eventuais frustrações pessoais.

J

Cara, isso não leva a nada, é o que pude ajudar e não impede de esperar outras respostas. Você está iniciando em HQL agora, então o normal seria primeiro estudar, tentar algo, postar a dúvida com código que tentou.

Criado 23 de abril de 2018
Ultima resposta 25 de abr. de 2018
Respostas 14
Participantes 3