Obter número da sequence com JPQL ou Criteria [resolvido]

Bom dia,

Estou tentando obter o valor da minha sequence para exibir na view antes de realizar um cadastro mas não estou conseguindo porque está dando um erro dizendo que a mesma não está mapeada...Será que alguém poderia me ajudar? Qnd rodo direto no postgres essa string sql ela retorna certo

Obrigado
Segue o erro:

Caused by: org.hibernate.hql.ast.QuerySyntaxException: alerta_sequence is not mapped [select last_value as id_alerta from alerta_sequence]

segue meu Alerta.java

@Entity
@Table(name="alerta")
@SequenceGenerator(name = "sequence", sequenceName = "alerta_sequence")
public class Alerta {

	@Id
	@NotNull
	@GeneratedValue(generator="sequence", strategy=GenerationType.AUTO)
	@Column(name="id_alerta")
	private Long idalerta;

AlertaDAO

public int retornaSequenceAlerta(){
	Query q = this.em.createQuery("select last_value as id_alerta from alerta_sequence");
	return (Integer) q.getSingleResult();
	}

Carinha, o problema aqui é que você não está executando SQL do POSTGRESQL, mas sim o “sql orientado a objeto” do JPA.

Para que você quer acessar o valor da sequence? É para popular o conteúdo de um campo? Então verifique que há um jeito de fazer com que a coluna seja populada por sequence.

Agora, se você quer simplesmente usar o valor da sequence para algum procedimento místico numerológico cabalístico, aí você poderia pegar o valor da sequence usando JDBC…

Pois é, Quero obter o valor da sequence pra popular o conteúdo de um campo e exibir na página de um formulário. Poderia fazer usando o CriteriaBuilder do JPA mas estou apanhando pra montar…

JDBC eu já usei, mas como estou usando JPA não gostaria de misturar as coisas.

obrigado

Resolvido!

public long getSequenceValue(){
        Query query = this.em.createNativeQuery("select nextval('alerta_sequence')");
        Object obj = query.getSingleResult();
        return ( (java.math.BigInteger)obj ).longValue();
    }

[quote=salmaox]Resolvido!

public long getSequenceValue(){ Query query = this.em.createNativeQuery("select nextval('alerta_sequence')"); Object obj = query.getSingleResult(); return ( (java.math.BigInteger)obj ).longValue(); } [/quote]

Tem certeza que isso realmente está funcionando da forma como quer?

Quando dá um next_val ele vai “queimar” um valor na sequence.

Na hora de inserir o registro de verdade, pelo seu mapeamento ele gera um novo valor, não?

Esse seria o comportamento padrão se tivesse usando jdbc… como está usando query nativa, não creio que o JPA abstrai isto.