Busca Colunas Especificas JPQL

6 respostas Resolvido
C

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

6 Respostas

staroski

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();
}
E
Solucao aceita

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

C

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?

E

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

staroski

Isso não é o tal do resultset mapping?

E

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

Criado 21 de julho de 2017
Ultima resposta 21 de jul. de 2017
Respostas 6
Participantes 3