Busca Colunas Especificas JPQL

Pessoal, tenho uma duvida, eu estou tentando trazer algumas colunas especificas do meu bd, e criei uma Query JPQL , para fazer está busca para mim o problema é que para mim parece estar tudo certo, mas sempre retorna o erro, poderiam dar uma olhada?

Essa é @NamedQuery

@NamedQueries({ 
@NamedQuery(name = "Ajudante.findDTO", query = "SELECT a.idUsuario, a.email,a.nome,a.salarioBase,a.salarioComissao FROM Ajudante as a") })

e está é a chamada no DAO:

public List<Ajudante> buscaSimples() {
		
		List<Ajudante> recebe = em.createNamedQuery("Ajudante.findDTO", Ajudante.class).getResultList();
		System.out.println(recebe);
		return recebe;
}

e está é exception:

>      org.jboss.resteasy.spi.UnhandledException: java.lang.IllegalArgumentException: Cannot create TypedQuery for query with more than one return using requested result type [br.com.teste.entites.Ajudante]
    	at org.jboss.resteasy.core.ExceptionHandler.handleApplicationException(ExceptionHandler.java:76)
    	at org.jboss.resteasy.core.ExceptionHandler.handleException(ExceptionHandler.java:212)
    	at org.jboss.resteasy.core.SynchronousDispatcher.writeException(SynchronousDispatcher.java:149)
    	at org.jboss.resteasy.core.SynchronousDispatcher.invoke(SynchronousDispatcher.java:372)
    	at org.jboss.resteasy.core.SynchronousDispatcher.invoke(SynchronousDispatcher.java:179)
    	at org.jboss.resteasy.plugins.server.servlet.ServletContainerDispatcher.service(ServletContainerDispatcher.java:220)
    	at org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher.service(HttpServletDispatcher.java:56)
    	at org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher.service(HttpServletDispatcher.java:51)
    	at javax.servlet.http.HttpServlet.service(HttpServlet.java:790)
    	at io.undertow.servlet.handlers.ServletHandler.handleRequest(ServletHandler.java:86)
    	at io.undertow.servlet.handlers.security.ServletSecurityRoleHandler.handleRequest(ServletSecurityRoleHandler.java:62)
    	at io.undertow.servlet.handlers.ServletDispatchingHandler.handleRequest(ServletDispatchingHandler.java:36)
    	at org.wildfly.extension.undertow.security.SecurityContextAssociationHandler.handleRequest(SecurityContextAssociationHandler.java:78)
    	at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)
    	at io.undertow.servlet.handlers.security.SSLInformationAssociationHandler.handleRequest(SSLInformationAssociationHandler.java:131)
    	at io.undertow.servlet.handlers.security.ServletAuthenticationCallHandler.handleRequest(ServletAuthenticationCallHandler.java:57)
    	at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)
    	at io.undertow.security.handlers.AbstractConfidentialityHandler.handleRequest(AbstractConfidentialityHandler.java:46)
    	at io.undertow.servlet.handlers.security.ServletConfidentialityConstraintHandler.handleRequest(ServletConfidentialityConstraintHandler.java:64)
    	at io.undertow.security.handlers.AuthenticationMechanismsHandler.handleRequest(AuthenticationMechanismsHandler.java:58)
    	at io.undertow.servlet.handlers.security.CachedAuthenticatedSessionHandler.handleRequest(CachedAuthenticatedSessionHandler.java:72)
    	at io.undertow.security.handlers.NotificationReceiverHandler.handleRequest(NotificationReceiverHandler.java:50)
    	at io.undertow.security.handlers.SecurityInitialHandler.handleRequest(SecurityInitialHandler.java:76)
    	at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)
    	at org.wildfly.extension.undertow.security.jacc.JACCContextIdHandler.handleRequest(JACCContextIdHandler.java:61)
    	at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)
    	at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)
    	at io.undertow.servlet.handlers.ServletInitialHandler.handleFirstRequest(ServletInitialHandler.java:282)
    	at io.undertow.servlet.handlers.ServletInitialHandler.dispatchRequest(ServletInitialHandler.java:261)
    	at io.undertow.servlet.handlers.ServletInitialHandler.access$000(ServletInitialHandler.java:80)
    	at io.undertow.servlet.handlers.ServletInitialHandler$1.handleRequest(ServletInitialHandler.java:172)
    	at io.undertow.server.Connectors.executeRootHandler(Connectors.java:199)
    	at io.undertow.server.HttpServerExchange$1.run(HttpServerExchange.java:774)
    	at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
    	at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
    	at java.lang.Thread.run(Unknown Source)
    Caused by: java.lang.IllegalArgumentException: Cannot create TypedQuery for query with more than one return using requested result type [br.com.teste.entites.Ajudante]
    	at org.hibernate.jpa.spi.AbstractEntityManagerImpl.resultClassChecking(AbstractEntityManagerImpl.java:396)
    	at org.hibernate.jpa.spi.AbstractEntityManagerImpl.createNamedJpqlQuery(AbstractEntityManagerImpl.java:794)
    	at org.hibernate.jpa.spi.AbstractEntityManagerImpl.buildQueryFromName(AbstractEntityManagerImpl.java:780)
    	at org.hibernate.jpa.spi.AbstractEntityManagerImpl.createNamedQuery(AbstractEntityManagerImpl.java:925)
    	at br.com.teste.dao.impl.AjudanteDAOImpl.buscaSimples(AjudanteDAOImpl.java:18)
    	at br.com.teste.service.impl.AjudanteServiceImpl.listarTodosFuncionariosSimples(AjudanteServiceImpl.java:50)
    	at br.com.teste.webservice.endpoint.AjudanteEndpoint.listarTodosFuncionariosSimples(AjudanteEndpoint.java:52)
    	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    	at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    	at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    	at java.lang.reflect.Method.invoke(Unknown Source)
    	at org.jboss.resteasy.core.MethodInjectorImpl.invoke(MethodInjectorImpl.java:137)
    	at org.jboss.resteasy.core.ResourceMethodInvoker.invokeOnTarget(ResourceMethodInvoker.java:296)
    	at org.jboss.resteasy.core.ResourceMethodInvoker.invoke(ResourceMethodInvoker.java:250)
    	at org.jboss.resteasy.core.ResourceMethodInvoker.invoke(ResourceMethodInvoker.java:237)
    	at org.jboss.resteasy.core.SynchronousDispatcher.invoke(SynchronousDispatcher.java:356)
    	... 32 more

Como o seu select retorna apenas alguns campos, o retorno não será uma lista de Ajudante e sim uma lista de Object[], onde cada posição do array equivale à uma das colunas que você está retornando.

Terá que fazer assim:

List<Object[]> registros = (List<Object[]>) em.createNamedQuery("Ajudante.findDTO").getResultList();
for (Object[] registro : registros) {
    for (Object coluna : registro) {
        System.out.print("    " + coluna);
    }
    System.out.println();
}
2 curtidas

Dá pra fazer retornar uma lista de objetos tbm, só precisa seguir algumas regras.

Cria um dto com os campos.
Cria um construtor nesse dto com todos os campos que deseja.
Depois no select vc dá um select new com.mycompany.ObjetoDto(campo1, campo2, campo3 …) from …

Só esqueci o nome disso na documentação pra postar o link certo hahha xD

1 curtida

Muito bom as duas implementações funcionam muito bem, basta ver qual se encaixa melhor, vlw pessoal muito obrigado mesmo.
Agora uma questão de performance, compensa fazer este tipo de busca especifica no banco? ou trago todos os dados e faço uma conversão para um objeto digamos “simplificado” tipo um filtro?

Normalmente quanto menos colunas mais rápido ficam as consultas…
mas acho que tudo depende de analisar a situação …

o que aprendi em TI é que não existe bala de prata pra nada rs

Isso não é o tal do resultset mapping?

Não =/
resultset mapping é outra coisa, realmente não lembro e não consegui achar o nome, mas nessa pagina tem um exemplo mais completo http://mdshannan1.blogspot.com.br/2010/10/reuse-jpa-entities-as-dto.html

1 curtida