Dúvida JPA + DATASOURCE[RESOLVIDO]

9 respostas
J

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:

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();

9 Respostas

H

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

R

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

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!

D

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

M

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,

R

marciobarroso:

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%')");

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

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.

R

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.

J

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

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();

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

R

Verifique se o nome dos objetos estao iguais aos da classe

Criado 11 de janeiro de 2013
Ultima resposta 14 de jan. de 2013
Respostas 9
Participantes 6