Problema em conversao em jsf

7 respostas
xxjamisxx

esto com grande problema no jsf na hora de fazer conversao
de uma entidade
ele me retorna este erro

AVISO: No positional parameters in query: from User usr where usr.id = ?1 
java.lang.IllegalArgumentException: No positional parameters in query: from User usr where usr.id = ?1

se alguem pude me ajuda agradeço esto ja um bom tempo
quebrando a cabeça nisso

7 Respostas

rsaraiva

Você está setando o parâmetro para a query?

Posta seu código que fica mais fácil identificar o problema.

Abraço

Hebert_Coelho

Seu erro nao está no jsf, mas na sua consulta.

conforme o rsaraiva já disse, está faltando passar algum valor na posição ?1.

xxjamisxx
public User getByIdUser(int id){
			
			Session ses = getSession();
			Query query = ses.createQuery("from Product usr where usr.id = ?1 ");
		    query.setInteger(1,id);
		    User usr = (User) query.uniqueResult();
		    ses.getTransaction().commit();
			ses.close();
			return usr; 
		}
A

não sei se é isso, mas ao colocar o teu parâmetro como ?1 não quer dizer que você a orderm do parâmetro a ser passado seja do número 1, e sim do primeiro valor passado (ficou um tanto confuso, mas vou melhorar a explicação)

Query query = ses.createQuery("from Product usr where usr.id = ?1 "); 
//?1 = ao primeiro parâmetro a ser passado, que por default é 0, então o parâmetro deveria ser passado assim:
query.setInteger(0,id); 
//Valor 0 de entrada que é o primeiro atributo a ser lido, 
//que será o ?1, e não o 1, pois esse se referiria ao 2° parâmetro

Se tivéssemos 2 parâmetros

Integer valor1 = 10;
String valor2 = "xxjamisxx";

Query query = ses.createQuery("from Product usr where usr.id = ?1 and usr.nome = ?2");  
query.setInteger(0,valor1); 
query.setString(1,valor2);

agora você terá o valor ?1 preenchido pelo setInteger para 0 e o ?2 estará preenchido com o setString para 1
Criando a sua query desta forma você terá benefícios, porque em qualquer momento da sua query você poderá reutilizar o seu ?#, o valor avi estar armazenado

Integer valor1 = 10;
String valor2 = "xxjamisxx";

Query query = ses.createQuery("from Product usr where (usr.id > ?1 or usr.id < ?1 or usr.id = ?1 or usr.id <> ?1) and usr.nome = ?2");
query.setInteger(0,valor1); 
query.setString(1,valor2);

se este não for o caso, fica pelomenos uma explicação :smiley:

xxjamisxx

cara nao era isso nao
mais muito obrigado do mesmo jeito
resolvi de outra maneira

public User getByIdUser(int id){
		
		Session ses = getSession();
		Query query = ses.createQuery("from User usr where id = :id ");
	    query.setParameter("id",id);
	    User usr = (User) query.uniqueResult();
	    ses.getTransaction().commit();
		ses.close();
		return usr; 
	}
A

se você utilizasse apenas ? você deveria mapear sequencial, funciona da mesma forma também, mas bom que solucionou o problema :smiley:

xxjamisxx

cara eu tentei fazer assim deixa so ?
pra se sequencial mais nao deu certo
o que conta mesmo que solucionei o problema
vc tem algum pdf , ou algum que me ajude
a entede melhor HQL ???

ja agradeço deste já a ajuda cara

Criado 28 de abril de 2012
Ultima resposta 30 de abr. de 2012
Respostas 7
Participantes 4