Problema com EclipseLink e instanciar um objeto em um select usando EJBQL

3 respostas
D

Olá a todos, meu primeiro post =D

Bom, gostaria de explicar o meu problema, no projeto que eu participo utilizamos ejbql para realizar nossas consultas,
e utilizava uma funcionalidade que era no select instanciar um novo objeto, fazia isso para os relatorios, eu monto um
objeto que será a fonte de dados do relatório, no caso JasperReports.

Exemplo:

String q = "SELECT NEW org.sigaept.edu.dominio.util.AlunoMatriculado( m ) FROM Matricula m ";// +
System.out.println("query pra teste: "+q);
Query query = em.createQuery(q);
List<Matricula> teste = query.getResultList();

acontece essa exceção:

Caused by: Exception [EclipseLink-6137] (Eclipse Persistence Services - 2.1.0.v20100614-r7608): org.eclipse.persistence.exceptions.QueryException
Exception Description: An Exception was thrown while executing a ReportQuery with a constructor expression: java.lang.reflect.InvocationTargetException
Query: ReportQuery(referenceClass=Matricula sql="SELECT id, data_matricula, numero, ciclo_matricula_id, aluno_id, status_aluno_curso_id, matriz_curricular_id, turma_id FROM matricula")

Usando a consulta normal, sem instanciar o objeto AlunoMatriculado, nao acontece nenhum problema.

o construtor da classe que tento instanciar está a seguir.

public AlunoMatriculado(Matricula m){
		aluno = m.getAluno();
		matricula = m;
		situacaoAlunoCurso = matricula.getStatusAlunoCurso().getDescricao();
}

Pesquisando sobre esse erro,EclipseLink-6137, apenas vi os relatos de problemas em utilizar essa tecnica no EclipseLink, mas ainda nenhuma solução,
Eu já ja utiilzei isso com o TopLink, mas alteram o provedor JPA do projeto para EclipseLInk, e agora tenho esse problema.

Mas gostaria de saber se saberiam me ajudar.

Obrigadoo

3 Respostas

Flavio_Almeida

Reparei que você está usando full qualified class name (org.sigaept.edu.dominio.util.AlunoMatriculado). Quem funciona dessa maneira é o Hibernate, mas a especificação JPA não diz nada sobre nomes qualificados. Provavelmente o EclipseLink esta seguindo a especificação. Experimente usar (NEW AlunoMatriculado) apenas.

Abraço

D

Olá Flavio,

Testei aqui, porém ele não encontrou o construtor, fiquei na dúvida de como o JPA saberá aonde está a classe, para poder instanciá-la.
log do glassfish:

Essa classe que eu tento instanciar, ela não é persistida no banco, apenas uma classe Java comum.

AlunoMatriculado.java

public class AlunoMatriculado {
	private Aluno aluno;
	private Matricula matricula;
	private String situacaoAlunoCurso;

	public AlunoMatriculado(Matricula m){
		aluno = m.getAluno();
		matricula = m;
		situacaoAlunoCurso = matricula.getStatusAlunoCurso().getDescricao();
	}
      //gets	
}

abracos

D

Olá, fiz um teste aqui, verifiquei que o problema não acontecia se eu utilizasse tipos primitivos,
então setando String ou Int funciona. :smiley:

Obrigado pela Ajuda.

Criado 25 de janeiro de 2011
Ultima resposta 25 de jan. de 2011
Respostas 3
Participantes 2