Funções em HQL queries devem ficar onde

7 respostas
sixrock6

Estou depurando um sistema no seguinte código:

String hql = "select me from MobilidadeEstudantil me where me.discente.id = ? and me.ativo = trueValue() ";
		hql += " and "+ano+""+periodo+" between soma_semestres(ano,periodo,0) and soma_semestres(ano,periodo,numero_periodos-1)) ";		
		Query q = getSession().createQuery(hql);
		q.setInteger(0, discente.getId()).setMaxResults(1);
		return (q != null && !q.list().isEmpty());

o erro apresentado é: org.postgresql.util.PSQLException: ERRO: fun??o soma_semestres(integer, integer, integer) n?o existe at

pelo que entendi a função soma_semestres não existe e eu não sei onde ela deveria estar;

Minha duvida é simples:
Onde ficam registradas essas funções?
ha alguma correspondência com funções na classe java?
essas função são store_procedures?

Alguem tem alguma pista?

7 Respostas

Hebert_Coelho

Você não tem como acessar essa função por HQL.
Ou você faz esse código no Java, ou então você utilizar NativeQuery e não Query apenas (como você está fazendo).

Esse post mostra como utilizar native query: JPA Consultas e Dicas.

sixrock6

Ola,

Isso é um tipo de sistema que ja foi comprado assim. Talvez você não tenha entendido.

Existe uma função “soma_semestres(ano,periodo,0)” sendo chamada na query HQL. Como se pode ver no codigo abaixo.

String hql = "select me from MobilidadeEstudantil me where me.discente.id = ? and me.ativo = trueValue() ";  
hql += " and "+ano+""+periodo+" between soma_semestres(ano,periodo,0) and soma_semestres(ano,periodo,numero_periodos-1)) ";       
Query q = getSession().createQuery(hql);  
q.setInteger(0, discente.getId()).setMaxResults(1);  
return (q != null && !q.list().isEmpty());

E existe tambem uma funcao java em um classe que me parece que faz a mesma coisa.

public static Integer somaSemestres(Integer ano, Integer semestre, Integer qtdSemestres) {
...

E eu preciso saber se essa função no HQL é relacionada com alguma função java

ou se ela é definida no banco?

Minha duvida poder ser boba. mas eu não consegui localizar pistas dessa função e sua definição.

Hebert_Coelho

Do modo como está, no banco.

OBS.: Esse código aí está aberto para ataque hacker de HqlInjection. Tome cuidado.

sixrock6

sem querer ser ou parecer rude (afinal ninguém tem obrigação de responder/ajudar a ninguém)

eu fui bem especifico no que eu quero saber, se entendeu e sabe o que eu quero e pode ajudar faça
senão ignore o post.

orogerio

sixrock6:
Ola,

Isso é um tipo de sistema que ja foi comprado assim. Talvez você não tenha entendido.

Existe uma função “soma_semestres(ano,periodo,0)” sendo chamada na query HQL. Como se pode ver no codigo abaixo.

String hql = "select me from MobilidadeEstudantil me where me.discente.id = ? and me.ativo = trueValue() ";  
hql += " and "+ano+""+periodo+" between soma_semestres(ano,periodo,0) and soma_semestres(ano,periodo,numero_periodos-1)) ";       
Query q = getSession().createQuery(hql);  
q.setInteger(0, discente.getId()).setMaxResults(1);  
return (q != null && !q.list().isEmpty());

E existe tambem uma funcao java em um classe que me parece que faz a mesma coisa.

public static Integer somaSemestres(Integer ano, Integer semestre, Integer qtdSemestres) {
...

E eu preciso saber se essa função no HQL é relacionada com alguma função java

ou se ela é definida no banco?

Minha duvida poder ser boba. mas eu não consegui localizar pistas dessa função e sua definição.

Se existe a função no java, e o objetivo é usar essa função do java, o HQL esta errado. Coloque aspas para fechar o between, e chama a função do java concatenando com +.
…between " + soma_semestres(ano,periodo,0) + "and " …

Hebert_Coelho

sixrock6:
sem querer ser ou parecer rude (afinal ninguém tem obrigação de responder/ajudar a ninguém)

eu fui bem especifico no que eu quero saber, se entendeu e sabe o que eu quero e pode ajudar faça
senão ignore o post.

Sem querer ou parecer rude, eu respondi o que você perguntou. vc não viu?
sixrock6:
E eu preciso saber se essa função no HQL é relacionada com alguma função java

ou se ela é definida no banco?

Minha duvida poder ser boba. mas eu não consegui localizar pistas dessa função e sua definição.

jakefrog:
Do modo como está, no banco.

sixrock6

orogerio

no 1º momento eu ate pensei em substituir igual vc falou. mas ai vi mais 3 ou 4 ocorrência dela em outros HQL do sistema.
Não cogitei o fato do HQL estar errado.

Com base no vc disse que ha erro no HQL e que não ha um lugar onde essas funções devam ser definidas ou associadas a funções existente.
vou abrir um chamado para a empresa que vendeu o sistema.

jakefrog
se a resposta ta link vou olhar depois mais detalhadamente.
desculpe qualquer mal entendido.

Obrigado a todos

Criado 30 de maio de 2012
Ultima resposta 30 de mai. de 2012
Respostas 7
Participantes 3