Problema com distinct

8 respostas
Matheus_Paiva

Tenho um progama que roda web e funciona normal sem o distinct mas quando coloco o distinct na query o progama retorna o erro java.lang.String cannot be cast to VO.Usuario

O metodo no dao com o distinct

public List<Usuario> listarVara() {

        Query dynaQuery = getConexao().createQuery("SELECT DISTINCT (u.vara) FROM Usuario u");
        return dynaQuery.getResultList();
 }
public class UsuarioMB {
    
private Usuario usuario;
private List<Usuario> usuarios;
private List<SelectItem> selectItems;
/** Creates a new instance of UsuarioMB */
 



public UsuarioMB(){ 
            
    this.usuario=new Usuario();

    fillSelectItems();
    }

    public Usuario getUsuario() {
        return usuario;
    }

     public List<Usuario> getUsuarios() {
        return usuarios;
    }

    public List<SelectItem> getSelectItems() {
        return selectItems;
    }

    public void setSelectItems(List<SelectItem> selectItems) {
        this.selectItems = selectItems;
    }
    public void setUsuarios(List<Usuario> usuarios) {
        this.usuarios = usuarios;
    }
    public void setUsuario(Usuario usuario) {
        this.usuario = usuario;
    }
    
    public String excluir() {
        UsuarioDAO uDAO = new UsuarioDAO();
        try {
            uDAO.deletar(usuario);
            JSFUtil.setaMensagemInfo("Exclusão efetuada com sucesso");
//            listar();

        } catch (Exception ex) {
            JSFUtil.setaMensagemInfo("Erro na exclusão: " + ex.getMessage());

        }
        return null;

    }
    public String limpar() {
        usuario = new Usuario();
        
        return null;
    }
  
    public String listar(){
    UsuarioDAO uDAO = new UsuarioDAO();

    usuarios=uDAO.listar();
    uDAO.getConexao().close();
    return "listar";
}
    public String buscar(){

    return "buscar";
}
    
public String cadastrar(){
UsuarioDAO uDAO=new UsuarioDAO();
        
       
        
  if (usuario.getNomeUsuario().equals(""))
{
  usuario.setNomeUsuario(null);
}
   try 
{
   uDAO.inserirEditar(usuario);
   limpar();
   JSFUtil.setaMensagemInfo("Cadastro/Edição efetuado com sucesso!");
        
   uDAO.getConexao().close();
}
   catch (Exception e) {
   JSFUtil.setaMensagemError("Erro no cadastro: "+e.getMessage());
   uDAO.getConexao().getTransaction().rollback();
}
        return null;
}
public String entrar(){
         
         return "entrar";
         
}
      
 private  void fillSelectItems() {
  
             UsuarioDAO uDAO = new UsuarioDAO();

       selectItems = new ArrayList<SelectItem>();

       selectItems.add(new SelectItem(null, "[SELECIONE]"));
        for (Usuario u : uDAO.listarVara()) {

            selectItems.add(new SelectItem(u.getVara(),u.getVara()));
            
        }
}
           
}

A exception

javax.servlet.ServletException: Cant instantiate class: MB.UsuarioMB java.lang.String cannot be cast to VO.Usuario

javax.faces.webapp.FacesServlet.service(FacesServlet.java:256)

org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:393)</blockquote>

A stacktrace completa 

[list]08/08/2012 16:17:52 org.apache.catalina.core.StandardWrapperValve invoke

GRAVE: Servlet.service() for servlet [Faces Servlet] in context with path [/SIAP] threw exception [Cant instantiate class: MB.UsuarioMB java.lang.String cannot be cast to VO.Usuario] with root cause

java.lang.ClassCastException: java.lang.String cannot be cast to VO.Usuario

at MB.UsuarioMB.fillSelectItems(UsuarioMB.java:127)

at MB.UsuarioMB.(UsuarioMB.java:34)

at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)

at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)

at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)

at java.lang.reflect.Constructor.newInstance(Constructor.java:513)

at java.lang.Class.newInstance0(Class.java:355)

at java.lang.Class.newInstance(Class.java:308)

at com.sun.faces.config.ManagedBeanFactoryImpl.newInstance(ManagedBeanFactoryImpl.java:277)

at com.sun.faces.application.ApplicationAssociate.createAndMaybeStoreManagedBeans(ApplicationAssociate.java:546)

at com.sun.faces.el.ManagedBeanELResolver.getValue(ManagedBeanELResolver.java:82)

at javax.el.CompositeELResolver.getValue(CompositeELResolver.java:67)

at com.sun.faces.el.FacesCompositeELResolver.getValue(FacesCompositeELResolver.java:64)

at org.apache.el.parser.AstIdentifier.getValue(AstIdentifier.java:72)

at org.apache.el.parser.AstValue.getValue(AstValue.java:147)

at org.apache.el.ValueExpressionImpl.getValue(ValueExpressionImpl.java:189)

at org.apache.jasper.el.JspValueExpression.getValue(JspValueExpression.java:106)

at javax.faces.component.UISelectItems.getValue(UISelectItems.java:130)

at com.sun.faces.renderkit.RenderKitUtils.getSelectItems(RenderKitUtils.java:323)

at com.sun.faces.renderkit.html_basic.MenuRenderer.getOptionNumber(MenuRenderer.java:675)

at com.sun.faces.renderkit.html_basic.MenuRenderer.renderSelect(MenuRenderer.java:793)

at com.sun.faces.renderkit.html_basic.MenuRenderer.encodeEnd(MenuRenderer.java:335)

at javax.faces.component.UIComponentBase.encodeEnd(UIComponentBase.java:836)

at javax.faces.component.UIComponent.encodeAll(UIComponent.java:896)

at javax.faces.render.Renderer.encodeChildren(Renderer.java:137)

at javax.faces.component.UIComponentBase.encodeChildren(UIComponentBase.java:812)

at javax.faces.component.UIComponent.encodeAll(UIComponent.java:886)

at javax.faces.component.UIComponent.encodeAll(UIComponent.java:892)

at com.sun.faces.application.ViewHandlerImpl.doRenderView(ViewHandlerImpl.java:245)

at com.sun.faces.application.ViewHandlerImpl.renderView(ViewHandlerImpl.java:176)

at org.ajax4jsf.application.ViewHandlerWrapper.renderView(ViewHandlerWrapper.java:100)

at org.ajax4jsf.application.AjaxViewHandler.renderView(AjaxViewHandler.java:176)

at com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:106)

at com.sun.faces.lifecycle.LifecycleImpl.phase(LifecycleImpl.java:251)

at com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:144)

at javax.faces.webapp.FacesServlet.service(FacesServlet.java:245)

at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)

at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)

at org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:393)

at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)

at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)

at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:225)

at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:169)

at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)

at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:168)

at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:98)

at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:927)

at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)

at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407)

at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:999)

at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:565)

at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:309)

at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)

at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)

at java.lang.Thread.run(Thread.java:619)

[/list]

Como fazer o distinct funcionar ?
Utilizo jpa 1.0 com jsf 1.2 …
A explicação da página http://www.objectdb.com/java/jpa/query/jpql/select#SELECT_DISTINCT_ não me ajudou pois montei igual e não rodou … será que alguem pode ajudar ?

8 Respostas

apferreira

Fala ae, Matheus!
O correto não seria utilizar apenas “SELECT DISTINCT u FROM Usuario u”?
Dá uma olhada neste link e veja se te ajuda em algo: http://docs.oracle.com/html/E24396_01/ejb3_langref.html
té+

M

Você tentou trocar de SELECT DISTINCT (u.vara) FROM Usuario u para SELECT DISTINCT (vara) AS vara FROM Usuario?

Matheus_Paiva

Dá erro …

Matheus_Paiva

Ele funciona mas não funciona o distinct continua trazendo os campos repetidos …
Se eu fizer sem o distict … funciona da mesma forma … trazendo assim os campos repetidos …
Realmente não sei o que é …

E

Eu pensei que você queria fazer algo como:

SELECT * FROM USUARIO WHERE VARA IN (SELECT DISTINCT VARA FROM USUARIO)

Mas isso não faz sentido, porque você continua a listar todos os usuários.

Você quer só listar o conjunto de varas? Nesse caso,o conjunto de varas distintas é uma lista de Strings, não de usuários.

Matheus_Paiva

entanglement
eu quero retornar o campo vara na tabela usuario …

B

Certo. Então é uma lista de Strings, não uma lista de usuários.

Matheus_Paiva

Resolvi ...

select DISTINCT(u.vara) FROM Usuario u  order by u.vara
Funcionou beleza ...
Criado 8 de agosto de 2012
Ultima resposta 13 de ago. de 2012
Respostas 8
Participantes 5