Já procurei em todo lugar mas não encontrei o que eu quero, gostaria apenas de pegar o valor de uma sequence no banco de dados, independente do banco que estiver utilizando, por esse motivo não posso fazer um “select sequence.nextval from dual”, eu observei que o hibernate na hora de fazer um insert em uma tabela q utiliza sequence, ele faz um select antes pra pegar o valor da sequence, e tipo, ele faz esse select na sequence de acordo com o banco que ele está utilizando, isso que queria q ele fizesse. Não sei se fui claro…
é possível sim, vc pode tentar utilizar uma query nativa.
danilogga
pois é… usando uma query nativa eu consigo, mas não quero encher meu código de if’s, if banco oracle então faz assim, if banco DB2 então faz assado, if banco Postgre então faz dessa forma, entendeu? Queria simplesmente falar pro hibernate que eu quero a sequence tal, se ele tem o Dialect e se ele busca a sequence de acordo com o banco quando vai fazer o insert, ele deveria me dar um método que só buscasse a sequence, sem fazer o insert. Se eu colocar query nativa, aí perde o sentido de usar o hibernate, pois vou ter que fazer alterações pra cada banco que minha aplicação rodar…
danilogga
pesquisando aqui eu encontrei uma classse HSQLDialect que tem o método getSelectSequenceNextValString(String sequenceName), só não sei como obter um ojbeto Dialect da minha conexão pra poder chamar esse método… se alguém souber de alguma coisa…
Abraços…
danilogga
ae galera, achei uma solução usando o native query só q mantendo a portabilidade de banco, segue abaixo:
no aquivo .properties com as propriedades da conexão, eu seto uma propriedade que diz quem é o Dialect:
quando inicio o system eu carrego essas propriedades pra dentro da classe System, aí criei um método getSequence(String nomeSequence) que cria uma instância do Dialect que tá setado no properties, e executo uma native query com o SQL que o método getSequenceNextValString(sequence) do Dialect gera pra mim, como esse Dialect é específico de cada banco, ele sabe qual a sintaxe que o banco utiliza e gera um SQL que rode perfeitamente.. :D :D :D :D :D :D :D :D :D :D :D :D :D :D :D
public Long getSequence(String sequence) throws Exception {
// pego a classe dialect que esta sendo usada
String obj = java.lang.System.getProperty("hibernate_dialect");
// crio um objeto Class da string que veio
Class klass = Class.forName(obj);
// crio uma nova instancia do Dialect
Dialect hsql = (Dialect)klass.newInstance();
// executa uma native query de acordo com o select q o dialect me retornou
Object val = getManager().createNativeQuery(hsql.getSequenceNextValString(sequence)).getSingleResult();
getManager().close();
// converte pra long antes de retornar, tive q converter antes pra String pq dependendo
// do banco ele retorna ou BigDecimal ou BigInteger
return Long.parseLong(String.valueOf(val));
}