Executando uma query e pegando o retorno com hibernate

10 respostas
Jedi_FeniX

Gostaria de executar esta query com hibernate: “SELECT COUNT(schemaname) FROM pg_tables WHERE schemaname = ‘public’;” e pegar o seu retorno.
Esta query iria ficar dentro de uma classe e eu estou usando PostgreSQL com Hibnernate.

10 Respostas

legionarioba

Porque você não usa simplesmente SQL Query?

Jedi_FeniX

Estou usando a SQL Query, mas não estou sabendo pegar os dados retornados da query…

legionarioba

Você já deu uma olhada lá no link que passei? Quando você faz uma consulta explícita, sem recuperar um objeto persistente a ser gerenciado pelo Hibernate, ele executa a sua consulta e recupera, no seu caso, um object. Mas você está processando uma consulta escalar, então precisa especificar qual tipo irá usar(se não vai acabar trazendo um BigDecimal, se não me falhe a memória 8) ) Acredito que isso resolva:

session.createSQLQuery("SELECT COUNT(schemaname) contador FROM pg_tables WHERE schemaname = 'public' ")
           .addScalar("contador", Hibernate.LONG);
Long qtde = (Long) session.uniqueResult();

Você não precisa de uma classe mapeada pra executar essa consulta, testa ai e vê se é o que precisa :slight_smile:

Marky.Vasconcelos

Se não me engano o resultado é um BigInteger e não um long, se for o caso é só mudar o cast e o tipo do objeto.

Jedi_FeniX

Valeu galera consegui resolver como o legionarioba falou… só troquei de Long para Integer…
Aproveitando, tem como criar e mapear um classe dinâmicamente?
Pq eu tenho várias tabelas que são criadas mensalmente…Tem como resolver isso com hibernate?

legionarioba

Não retorna um Long não como eu disse, pra isso o addScalar :slight_smile:

legionarioba

Tabelas criadas mensalmente? Xii tá com cara de furo, explica melhor porque você precisa disso…

Existe a classe SchemaExport, que recebe um Configuration(aquele mesmo do seu HibernateUtil). Mas isso é usado pra, por exemplo, se você quiser criar um programinha desktop, e deixar o cliente escolher qual banco quer utilizar(vais precisar claro das configs e acessos do banco). Essa situação sua não vejo muito sentido…

Jedi_FeniX

Nós fazemos isso aqui na empresa para não ficar com uma tabela com muitos registro e para poder medir a quantidade de registros de um mês com mais tranquilidade, na maioria das vezes em um 1 mês, no mínimo, é criado 50 milhões de registros…
E também no meu sistema tem a possibilidade do usuário criar schemas e dentro destes schemas teriam estas tabelas mensais…

legionarioba

Explica melhor essa arquitetura…O processo de criação da session factory é bastante custoso, mas como o mesmo é thread-safe no caso da web você cria chamando o HibernateUtil num listener do contexto, mas no seu caso, com usuários distintos com schemas distintos, isso pode ser deveras custoso. Desculpe perguntar, mas que tipo de negócio trabalha para gerar 50 milhões de registros em uma única tabela em um mês :shock:

Jedi_FeniX

Aqui nós trabalhamos com sms, wap, tudo relacionado a mobile…
Um exemplo no último paradão do BBB8 foi gerado em uma noite 1 milhão de registro.
E este meu sistema não vai rodar na web.

Criado 14 de outubro de 2008
Ultima resposta 14 de out. de 2008
Respostas 10
Participantes 3