Dúvida JPA + DATASOURCE[RESOLVIDO]

Olá pessoal, estou tentando fazer uma consulta no banco de dados porém o java me retorna um erro de sintaxe da query:

16:48:40,302 ERROR [org.jboss.as.ejb3.invocation] (http-localhost/127.0.0.1:8080-4) JBAS014134: EJB Invocation failed on component EProtocoloDAO for method public java.util.List br.gov.rs.tce.eprotocolo.dao.EProtocoloDAO.findByEProtocoloPesquisaTO(java.lang.String,java.util.Date,java.util.Date,java.lang.String,int,int): java.lang.IllegalArgumentException: org.hibernate.hql.internal.ast.QuerySyntaxException: unexpected token: PROTOCOLOS near line 1, column 94 [SELECT P.NOME_SERVIDOR, P.CPF_SERVIDOR, P.DT_CRIACAO, S.DS_SITUACAOFROM PROTOCOLOS P, OBJETOS O, TIPOS_OBJETO TPO, TIPOS_PROTOCOLO TP, SITUACOES SWHERE O.ID_OBJETO = P.ID_OBJETOAND O.ID_TIPO = TPO.ID_TIPOAND P.ID_TIPO = TP.ID_TIPOAND O.ID_SITUACAO = S.ID_SITUACAOAND ((:id_situacao IS NULL AND O.ID_SITUACAO = 9 ) OR O.ID_SITUACAO = :id_situacao)AND (:nome_interessado IS NULL OR P.NOME_SERVIDOR LIKE ‘%:nome_interessado%’)AND (:cpf_interessado IS NULL OR P.CPF_SERVIDOR LIKE ‘%:cpf_interessado%’)AND P.DT_CRIACAO BETWEEN :dt_p_inicial AND :dt_p_final]

Query:

[code]StringBuilder sql = new StringBuilder();
sql.append(“SELECT P.NOME_SERVIDOR,”);
sql.append(" P.CPF_SERVIDOR,");
sql.append(" P.DT_CRIACAO,");
sql.append(" S.DS_SITUACAO");
sql.append(“FROM PROTOCOLOS P,”);
sql.append(" OBJETOS O,");
sql.append(" TIPOS_OBJETO TPO,");
sql.append(" TIPOS_PROTOCOLO TP,");
sql.append(" SITUACOES S");
sql.append(“WHERE O.ID_OBJETO = P.ID_OBJETO”);
sql.append(“AND O.ID_TIPO = TPO.ID_TIPO”);
sql.append(“AND P.ID_TIPO = TP.ID_TIPO”);
sql.append(“AND O.ID_SITUACAO = S.ID_SITUACAO”);
sql.append(“AND ((:id_situacao IS NULL AND O.ID_SITUACAO = 9 ) OR O.ID_SITUACAO = :id_situacao)”);
sql.append(“AND (:nome_interessado IS NULL OR P.NOME_SERVIDOR LIKE ‘%:nome_interessado%’)”);
sql.append(“AND (:cpf_interessado IS NULL OR P.CPF_SERVIDOR LIKE ‘%:cpf_interessado%’)”);
sql.append(“AND P.DT_CRIACAO BETWEEN :dt_p_inicial AND :dt_p_final”);

	Query query = em.createQuery(sql.toString(), EProtocolo.class)
	.setParameter("id_situacao", idSituacao)
	.setParameter("nome_interessado", nomeInteressado)
	.setParameter("cpf_interessado", cpfInteressado)
	.setParameter("dt_p_inicial", dtProtocolacaoInicial)
	.setParameter("dt_p_final", dtProtocolacaoFinal);		
	
	return query.getResultList();[/code]

Eu uso like como descrito aqui: JPA Consultas e Dicas.

Isso aqui ta certo? '%:nome_interessado%'

tenta assim: .setParameter("nome_interessado", "%" + nomeInteressado + "%")

Acho que ele não lê o parametro se tiver o % junto com o :
Fica uma string só, dai eu acho que ele não reconhece como um parâmetro.

Dúvidas:

1- Suas classes mapeadas se chamam PROTOCOLOS, OBJETOS, TIPOS_OBJETOS, TIPOS_PROTOCOLOS e SITUACOES ? Imagino que estes sejam os nomes das tabelas e não das entidades.

No seu SELECT você tem que usar o nome da entidade.

Por exemplo:

@Entity
@Table(name="PROTOCOLOS")
public class Protocolo {}

Seu código tem que ser:

SELECT p.id FROM Protocolo WHERE p.variavel = '10'

2 - Os atributos da sua classe se chamam NOME_SERVIDOR, CPF_SERVIDOR, etc. ?

Você tem que colocar o nome do atributo da Classe e não a coluna da tabela.

Abraços!

Você pode tentar usar o createNativeQuery se seu código for SQL Nativo e não JPQL

Olha só,

Acho que esse trecho do código esta errado. Você esta atribuindo ao nome de um campo um parâmetro?!? :id_situacao is NULL

Quando você for usar like, você deve concatenar o ‘%’ na hora de setar o parâmetro na query, como mostrado pelo romarcio …

Boa sorte,

[quote=marciobarroso][quote]

        sql.append("AND ((:id_situacao IS NULL AND O.ID_SITUACAO = 9 ) OR O.ID_SITUACAO = :id_situacao)");  
        sql.append("AND (:nome_interessado IS NULL OR P.NOME_SERVIDOR LIKE '%:nome_interessado%')");  
        sql.append("AND (:cpf_interessado IS NULL OR P.CPF_SERVIDOR LIKE '%:cpf_interessado%')");  

[/quote]

Olha só,

Acho que esse trecho do código esta errado. Você esta atribuindo ao nome de um campo um parâmetro?!? :id_situacao is NULL

[/quote]

Bem observado essa questão do nome do campo sendo um parametro. Não tinha percebido isso.

Por isso prefiro usar Criteria sempre que possível, evita esse tipo erro.

Esta sem espaco na construcao do sql nestes trechos:

sql.append("       S.DS_SITUACAO");  
sql.append("FROM PROTOCOLOS P,");


sql.append("     SITUACOES S");  
sql.append("WHERE O.ID_OBJETO = P.ID_OBJETO");  

Verifiquei que existem outros trechos sem espaco tb, reveja sua query.

Eu traduzi a query para jpa como vocês alertaram e agora estou com erro no condicional ON do JOIN. A query ficou assim:

[code] StringBuilder sql = new StringBuilder();
sql.append(“select p.nomeInteressado,”);
sql.append(" p.cpfInteressado,");
sql.append(" p.dataCriacao,");
sql.append(" s.descricao ");
sql.append("from eprotocolo p ");
sql.append("join eobjeto o on o.id = p.id ");
sql.append("join tipoprotocolo tp on tp.id = p.tipo.id ");
sql.append("join situacao s on s.id = o.situacao.id ");
sql.append("where p.nomeInteressado like :nome_interessado ");
sql.append("and p.situacao.id = s.id ");
sql.append("and p.datacriacao between :dt_p_inicial and :dt_p_final ");
sql.append("and p.cpfinteressado like :cpf_interessado ");
sql.append("and (o.situacao.id = :id_situacao or (:id_situacao is -1 and o.situacao.id = 9)) ");
sql.append(“and o.situacao.id = :id_situacao)) or (:id_situacao -1 and o.situacao.id = 9)” );
sql.append(“order by s.descricao, p.datacriacao”);

	Query query = em.createQuery(sql.toString(), EProtocolo.class)
	.setParameter("id_situacao", idSituacao)
	.setParameter("nome_interessado", "%" + nomeInteressado + "%")
	.setParameter("cpf_interessado", cpfInteressado)
	.setParameter("dt_p_inicial", dtProtocolacaoInicial)
	.setParameter("dt_p_final", dtProtocolacaoFinal);		
	
	return query.getResultList();[/code]

O erro que ocorre:

10:48:44,814 ERROR [org.hibernate.hql.internal.ast.ErrorCounter] (http-localhost/127.0.0.1:8080-6) line 1:129: unexpected token: on
10:48:44,814 ERROR [org.hibernate.hql.internal.ast.ErrorCounter] (http-localhost/127.0.0.1:8080-6) line 1:129: unexpected token: on: line 1:129: unexpected token: on

Verifique se o nome dos objetos estao iguais aos da classe