Problemas com consulta no JPA

Olá Colegas,
Estou com um problema ao fazer uma consulta tendo q passar um parâmetro.

Tentei fazer a consulta de duas maneiras e ambos dá erro: :frowning:

Segue os códigos abaixo, quem poder ajudar agradeço

public static final String consulta = "SELECT f FROM Produto f " +  
									"WHERE 	f.referencia LIKE ':%nomeProduto%' OR" +
									" 	   	f.nome LIKE  ':%nomeProduto%'  OR" +
									"		f.descricao LIKE ':%nomeProduto%'  OR" +
									"		f.especificacao LIKE  ':%nomeProduto%'  ";

@SuppressWarnings("unchecked")
public List<Produto> procuraProduto(String nomeProd){

	Object[] nomeProduto = new Object[1];
	nomeProduto[0] = nomeProd;

	return getJpaTemplate().find(consulta, new Object[] {  nomeProd});

Com esse código dah esse erro:

Caused by: org.hibernate.QueryParameterException: could not locate named parameter [1]

Fazendo dessa maneira, aparece esse erro:

public EntityManager entityManager;
public EntityManagerFactory entityManagerFactory;

public ProdutoDAO(EntityManagerFactory entityManagerFactory,EntityTransaction transaction,EntityManager entityManager) {
this.entityManagerFactory = entityManagerFactory;
this.entityManager = entityManagerFactory.createEntityManager();

}

entityManager.createNamedQuery("consulta ")

dá null pointer nesse createNamedQuery
java.lang.NullPointerException

br.com.lojasurfwave.service.login.ProdutoDAO.procuraProduto(ProdutoDAO.java:81)

E por fim fiz de outra forma…e acontece o mesmo null pointer

@NamedQueries({
@NamedQuery (
name=“consultaProduto”,
query= “SELECT f FROM Produto f " +
“WHERE f.referencia LIKE ‘:%nomeProduto%’ OR” +
" f.nome LIKE ‘:%nomeProduto%’ OR” +
" f.descricao LIKE ‘:%nomeProduto%’ OR" +
" f.especificacao LIKE ‘:%nomeProduto%’ "
)
})

	List produto = entityManager.createNamedQuery("consultaProduto ")
	   .setParameter("nomeProduto", camisa)
	   .getResultList();   

OBrigado

O erro está nos parâmetros

erro:

 f.nome LIKE '[b]:[/b]%nomeProduto%' OR

corrigido

 f.nome LIKE '%[b]:[/b]nomeProduto%' OR

:thumbup:

Então cara…
fiz essa alteração e persiste no erro.
root cause

java.lang.IllegalArgumentException: org.hibernate.QueryParameterException: could not locate named parameter [1]

Obrigado

Tive essa mesmo problema. O que fiz foi retirar o % do select e colocá-lo no momento em que eu envio o parâmentro…

ex.:
query.setParameter(“paciente”, “%”+nome+"%");

Bom, comigo funcionou…qq coisa posta aí de novo.

Então qdo uso dessa forma aparece um null pointer nessa linha
Query query=this.entityManager.createQuery(consulta);

Sendo e estou setando o entityManager dessa forma:

public EntityManager entityManager;
public EntityManagerFactory entityManagerFactory;

public ProdutoDAO() {

}

public ProdutoDAO(EntityManagerFactory entityManagerFactory,EntityTransaction transaction,EntityManager entityManager) {
      this.entityManagerFactory = entityManagerFactory;
      this.entityManager = entityManagerFactory.createEntityManager();
      
      
}

Eu uso o padrão sigleton para disponibilizar os serviços da EntityManager:

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;

//Implentação de singleton
public class Conexao_JPA
{	
	private static EntityManagerFactory emf = null;
	private static EntityManager em = null;	
	
	//Esconde o construtor
	private Conexao_JPA()
	{		
	}
	
	//Método q retonar um objeto de conexão
	public static EntityManager getConexao_JPA()
	{
		//Verifica se a conexão foi criada
		if (emf == null)
		{			
			//Instancia o objeto de conexão
			emf = Persistence.createEntityManagerFactory("pu1");
			em = emf.createEntityManager();
		}
		
		return em;
		
	}
	
	//Método q atualiza um objeto com o bd
	public static void atualizarObjeto(Object obj)
	{
		 em.refresh(obj);	
	}
}

Então minhas classes de persistência ficam:

package odonto.persistence;

import java.util.List;

import javax.persistence.EntityManager;
import javax.persistence.Query;

import odonto.model.Atendimento;
import odonto.model.Pessoa_Fisica;
import odonto.model.Pessoa_Juridica;
import utils.Conexao_JPA;

public class DaoAtendimento 
{
	private EntityManager em;

	public DaoAtendimento() 
	{
	    em = Conexao_JPA.getConexao_JPA();
	}

	@SuppressWarnings("unchecked")
	public List<Atendimento> getByPacienteNome(String nome)
	{
	    Query query = em.createNamedQuery("atendimentoByNomePaciente");
	    query.setParameter("paciente", "%"+nome+"%");	    
	    
	    return (List<Atendimento>) query.getResultList();
	}		
}

e minha classe de modelo:

package odonto.model;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.OneToMany;
import javax.persistence.OneToOne;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;

@Entity
@NamedQueries(value={		
		@NamedQuery(name="atendimentoByNomePaciente", query="select a from Atendimento a where a.paciente.nome like :paciente order by a.data_atendimento desc")
})
public class Atendimento 
{
  @Id
	@Column (insertable = false)
	@GeneratedValue (strategy = GenerationType.SEQUENCE, generator = "atendimento_id_seq")
	private int id;
	@ManyToOne //(cascade=CascadeType.REFRESH)
	@JoinColumn(name="id_paciente")
	private Pessoa_Fisica paciente = null; //Sendo q o objeto paciente tem um atributo nome que foi utilizado no select a.paciente.nome

  //construtores

  //getters e setters

}

Outra coisa, não consegui entender o último problema q vc reportou.

Entedi quase tudo cara…

quado estou fazendo a chamada do EntityManagerFactory , EntityManager faço no xml no applicationContext.xml, nesse caso vou fazer o teste com essa classe, o que eu não entendi
foi esse
emf = Persistence.createEntityManagerFactory(“pu1”);
esse pu1 seria meu dataSourceTeste ?!?!

Vlw mano pela ajuda!!!

<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
    <property name="dataSource" ref="dataSourceTeste" />
    <property name="jpaVendorAdapter">
        <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
            <property name="database" value="MYSQL" />
            <property name="showSql" value="true" />
        </bean>
    </property>
</bean>

<bean id="dataSourceTeste" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    <property name="driverClassName" value="com.mysql.jdbc.Driver" />
    <property name="url" value="jdbc:mysql://localhost:3306/db_loja"/>
    <property name="username" value="root" />
    <property name="password" value="root" />
</bean>

<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
    <property name="entityManagerFactory" ref="entityManagerFactory" />
    <property name="dataSource" ref="dataSourceTeste"/>
</bean>

Tava olhando com mais calma seu select e vi q vc deve retirar os apostrofos ( ’ ) em torno dos seus parametros…pode ser isso tbm…mas naum tenho certeza.

esse “put1” é o nome do meu arquivo de persistence

<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="1.0" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd">
    <persistence-unit name="pu1">
        <provider>oracle.toplink.essentials.ejb.cmp3.EntityManagerFactoryProvider</provider>
        <class>odonto.model.Estado</class>  
        <class>odonto.model.Pessoa</class>       
        <class>odonto.model.Pessoa_Fisica</class>  
        <class>odonto.model.Pessoa_Juridica</class> 
        <class>odonto.model.Endereco</class> 
        <class>odonto.model.Documento</class> 
        <class>odonto.model.Contato</class> 
        <class>odonto.model.Usuario</class> 
        <class>odonto.model.Perfil</class> 
        <class>odonto.model.Agenda</class> 
        <class>odonto.model.Especialidade</class> 
        <class>odonto.model.Servico</class> 
        <class>odonto.model.Tabela_Convenio</class> 
        <class>odonto.model.Item_Tabela</class>         
        <class>odonto.model.Atendimento</class> 
        <class>odonto.model.Item_Atendimento</class> 
        <class>odonto.model.Orcamento</class> 
        <class>odonto.model.Item_Orcamento</class> 
        <class>odonto.model.Parcela</class> 
        <class>odonto.model.Pagamento</class> 
        <class>odonto.model.Pagamento_Dentista</class> 
        <properties>
            <property name="toplink.jdbc.driver" value="org.postgresql.Driver"/>
            <property name="toplink.jdbc.url" value="jdb:postgresql://localhost:5432/OdontoSys"/>
            <property name="toplink.jdbc.user" value="XXXXXXXXXXXXX"/>
            <property name="toplink.jdbc.password" value="XXXXXXXXXXXXX"/>
            <property name="toplink.logging.level" value="INFO"/>
        </properties>
    </persistence-unit>
</persistence>

Eu uso o JPA do TopLink não sei ao certo como é isso no Hibernat.

blz cara mto obrigado…
Irei testar!!!