Hibernate utilizando Distinct e Inner Join

8 respostas
Helder8

Olá pessoal,

Estou com uma dúvida de como usar o select abaixo, no frameworks Hibernate. Eu já utilizo hibernate na minha aplicação, mas não sei como fazer um SELECT DISTINCT, UNION e INNER JOIN .

SELECT DISTINCT MATRICULA, CRACHA, NOMECOMPLETO, NOMEABREVIADO, ID_EMPRESA, EMPRESA, ID_CLASSIFICACAO, CLASSIFICACAO, ID_CENTRODERESPONSABILIDADE, CENTRODERESPONSABILIDADE, ID_GERA_NIVEIS, NIVEL, PERMISSAOACESSO, IDENTIDADE, SENHA, VEICULO, PLACA, ID_JORNADA, JORNADA, MOTIVO FROM (
SELECT u.MATRICULA, u.CRACHA, u.NOMECOMPLETO, u.NOMEABREVIADO, u.ID_EMPRESA, u.EMPRESA, u.ID_CLASSIFICACAO, u.CLASSIFICACAO, u.ID_CENTRODERESPONSABILIDADE, u.CENTRODERESPONSABILIDADE, u.ID_GERA_NIVEIS, u.NIVEL, u.PERMISSAOACESSO, u.IDENTIDADE, u.SENHA, u.VEICULO, u.PLACA, u.ID_JORNADA, u.JORNADA, u.MOTIVO FROM GERA_USUARIOS u
INNER JOIN gera_empresas e on u.empresa = e.codigo
inner join GERA_ACESSO_USUARIO t ON u.MATRICULA = t.MATRICULA
INNER JOIN GERA_DIREITOSDEACESSO d ON t.id_nivel = d.ID_NIVEL
UNION
SELECT u.MATRICULA, u.CRACHA, u.NOMECOMPLETO, u.NOMEABREVIADO, u.ID_EMPRESA, u.EMPRESA, u.ID_CLASSIFICACAO, u.CLASSIFICACAO, u.ID_CENTRODERESPONSABILIDADE, u.CENTRODERESPONSABILIDADE, u.ID_GERA_NIVEIS, u.NIVEL, u.PERMISSAOACESSO, u.IDENTIDADE, u.SENHA, u.VEICULO, u.PLACA, u.ID_JORNADA, u.JORNADA, u.MOTIVO FROM GERA_USUARIOS u
INNER JOIN gera_empresas e on u.empresa = e.codigo
inner join GERA_HISTORICO_JORNADA h ON u.MATRICULA = h.MATRICULA
INNER JOIN GERA_DIREITOSDEACESSO d ON h.id_gera_niveis = d.ID_NIVEL
)DERIVEDTBL ORDER BY matricula

Alguém tem idéia de como fazer esse select utilizando o Hibernate?

8 Respostas

Vmaia

Como vc está usando o hibernate ?

Muitas  vezes isso é resolvido atraves de relacionamentos;

Outras por HQL;

Outras por Criteria;

Acredito que se você pesquisar por JOIN + HQL (ou CRITERIA) resolva teu problema.

boa sorte :P.

Helder8

Estou tentando usar O HQL dessa forma:

public java.util.List find(String condicao) throws Exception {
    session = factory.openSession();
    //Transaction tx = session.beginTransaction();
    
    List retorno = (List)session.createCriteria(condicao);
    session.flush();
    //tx.commit();
    
  //Para fehar a conexão com o banco de dados
    session.connection().close();
    
    session.close();
    
    return retorno;
}

Onde a String “condicao” seria o select que estou tentando passar. Mas quando eu executo esse metodo passando o select acima da erro.

Tem algum exemplo de como eu deveria executar o HQL usando UNION, SELECT DISTINCT e INNER JOIN?

Vmaia

Amigo coloque o código em tag code, tem até uma “barrinha” de ferramentas com ele na hora de fazer o post, ajuda na visualização.
Pelo que vi está utilizando o criteria, de uma googleada sobre HQl, pois estou saindo do trampo agora e volto só depois das 20hrs.

Abs,
vmaia :stuck_out_tongue:

Helder8

Conforme combinado segue abaixo o codigo.

public java.util.List find(String condicao) throws Exception { 
session = factory.openSession(); 
//Transaction tx = session.beginTransaction(); 

List retorno = (List)session.createCriteria(condicao); 
session.flush(); 
//tx.commit(); 

//Para fehar a conexão com o banco de dados 
session.connection().close(); 

session.close(); 

return retorno; 
}

Você tem alguma ideia de como fazer um select no hibernate utilizando criteria com INNER JOIN, UNION e DISTINCT?

Helder8

A String condicao esta sendo passada assim:

condicao = "SELECT DISTINCT MATRICULA, NOMECOMPLETO FROM ( SELECT u.MATRICULA, u.NOMECOMPLETO FROM GeraUsuariosAdmBean as u " + "INNER JOIN geraEmpresas in class br.com.trielo.mdc4web.bean.BeanGeraEmpresas as e on u.empresa = e.codigo " + "INNER JOIN geraAcessoUsuarioBean in class br.com.trielo.mdc4web.bean.GeraAcessoUsuarioBean as t ON u.MATRICULA = t.MATRICULA " + "INNER JOIN geraDireitodeacessoBean in class br.com.trielo.mdc4web.bean.GeraDireitosdeacessoBean as d ON t.nivel = '002' " + "UNION " + "SELECT u.MATRICULA, u.NOMECOMPLETO FROM GeraUsuariosAdmBean as u " + "INNER JOIN geraEmpresas in class br.com.trielo.mdc4web.bean.BeanGeraEmpresas as e on u.empresa = e.codigo " + "inner join GeraHistoricoJornadaBean as h ON u.MATRICULA = h.MATRICULA " + "INNER JOIN geraDireitodeacessoBean in class br.com.trielo.mdc4web.bean.GeraDireitosdeacessoBean as d ON h.idGeraNiveis = '002' " + ")DERIVEDTBL ORDER BY MATRICULA";

Helder8

Ao executar o criteria da o seguinte erro:

org.hibernate.hql.ast.QuerySyntaxException: unexpected token: ( near line 1, column 46 [SELECT DISTINCT MATRICULA, NOMECOMPLETO FROM ( SELECT  u.MATRICULA, u.NOMECOMPLETO FROM  br.com.trielo.mdc4web.bean.GeraUsuariosAdmBean as u INNER JOIN geraEmpresas in class br.com.trielo.mdc4web.bean.BeanGeraEmpresas as e on u.empresa = e.codigo  INNER JOIN geraAcessoUsuarioBean in class br.com.trielo.mdc4web.bean.GeraAcessoUsuarioBean as t ON u.MATRICULA = t.MATRICULA  INNER JOIN geraDireitodeacessoBean in class br.com.trielo.mdc4web.bean.GeraDireitosdeacessoBean as d ON t.nivel = '002' UNION SELECT  u.MATRICULA, u.NOMECOMPLETO FROM  br.com.trielo.mdc4web.bean.GeraUsuariosAdmBean as u INNER JOIN geraEmpresas in class br.com.trielo.mdc4web.bean.BeanGeraEmpresas as e on u.empresa = e.codigo  inner join GeraHistoricoJornadaBean as h ON u.MATRICULA = h.MATRICULA  INNER JOIN geraDireitodeacessoBean in class br.com.trielo.mdc4web.bean.GeraDireitosdeacessoBean as d ON h.idGeraNiveis = '002'      )DERIVEDTBL ORDER BY  MATRICULA]
	at org.hibernate.hql.ast.QuerySyntaxException.convert(QuerySyntaxException.java:31)
	at org.hibernate.hql.ast.QuerySyntaxException.convert(QuerySyntaxException.java:24)
	at org.hibernate.hql.ast.ErrorCounter.throwQueryException(ErrorCounter.java:59)
	at org.hibernate.hql.ast.QueryTranslatorImpl.parse(QueryTranslatorImpl.java:258)
	at org.hibernate.hql.ast.QueryTranslatorImpl.doCompile(QueryTranslatorImpl.java:157)
	at org.hibernate.hql.ast.QueryTranslatorImpl.compile(QueryTranslatorImpl.java:111)
	at org.hibernate.engine.query.HQLQueryPlan.<init>(HQLQueryPlan.java:77)
	at org.hibernate.engine.query.HQLQueryPlan.<init>(HQLQueryPlan.java:56)
	at org.hibernate.engine.query.QueryPlanCache.getHQLQueryPlan(QueryPlanCache.java:72)
	at org.hibernate.impl.AbstractSessionImpl.getHQLQueryPlan(AbstractSessionImpl.java:133)
	at org.hibernate.impl.SessionImpl.list(SessionImpl.java:1113)
	at org.hibernate.impl.SessionImpl.find(SessionImpl.java:1098)
	at br.com.trielo.mdc4web.model.framework.SimpleDAO.find(SimpleDAO.java:240)
	at br.com.trielo.mdc4web.model.framework.SimpleModel.find(SimpleModel.java:166)
	at br.com.trielo.mdc4web.model.GeraUsuariosAdmModel.findByCriterio(GeraUsuariosAdmModel.java:950)
	at br.com.trielo.mdc4web.model.GeraUsuariosAdmModel.findByCriterio(GeraUsuariosAdmModel.java:977)
	at br.com.trielo.mdc4web.action.UsuariosAdmAction.lista(UsuariosAdmAction.java:292)
	at br.com.trielo.mdc4web.action.UsuariosAdmAction.pesquisa(UsuariosAdmAction.java:1175)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
	at java.lang.reflect.Method.invoke(Method.java:597)
	at org.apache.struts.actions.DispatchAction.dispatchMethod(DispatchAction.java:266)
	at org.apache.struts.actions.DispatchAction.execute(DispatchAction.java:167)
	at br.com.trielo.mdc4web.model.framework.SimpleAction.execute(SimpleAction.java:147)
	at org.apache.struts.chain.commands.servlet.ExecuteAction.execute(ExecuteAction.java:53)
	at org.apache.struts.chain.commands.AbstractExecuteAction.execute(AbstractExecuteAction.java:64)
	at org.apache.struts.chain.commands.ActionCommandBase.execute(ActionCommandBase.java:48)
	at org.apache.commons.chain.impl.ChainBase.execute(ChainBase.java:190)
	at org.apache.commons.chain.generic.LookupCommand.execute(LookupCommand.java:304)
	at org.apache.commons.chain.impl.ChainBase.execute(ChainBase.java:190)
	at org.apache.struts.chain.ComposableRequestProcessor.process(ComposableRequestProcessor.java:280)
	at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1858)
	at org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:459)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:637)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
	at br.com.trielo.mdc4web.filters.AuthorizationFilter.doFilter(AuthorizationFilter.java:135)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:298)
	at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:852)
	at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:588)
	at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489)
	at java.lang.Thread.run(Thread.java:619)
Vmaia

Opa!
Temos que dar uma olhada no SimplesDAO.java na linha 240.

Outra coisa é pegar o SQL gerado e rodar no direto no teu banco para saber o que se sai tudo certo.

Helder8

O select abaixo está funcionando normalmente no banco de dados SQL-SERVER.

SELECT DISTINCT MATRICULA, NOMECOMPLETO FROM ( 
SELECT u.MATRICULA, u.NOMECOMPLETO FROM GERA_USUARIOS u 
INNER JOIN gera_empresas e on u.empresa = e.codigo 
inner join GERA_ACESSO_USUARIO t ON u.MATRICULA = t.MATRICULA 
INNER JOIN GERA_DIREITOSDEACESSO d ON t.id_nivel = d.ID_NIVEL 
UNION 
SELECT u.MATRICULA, u.NOMECOMPLETO FROM GERA_USUARIOS u 
INNER JOIN gera_empresas e on u.empresa = e.codigo 
inner join GERA_HISTORICO_JORNADA h ON u.MATRICULA = h.MATRICULA 
INNER JOIN GERA_DIREITOSDEACESSO d ON h.id_gera_niveis = d.ID_NIVEL 
)DERIVEDTBL ORDER BY matricula

O código simpleModel está assim:

public List find(String condicao) throws Exception {
		if (this.transactDAO == null) {
			SimpleDAO dao = new SimpleDAO(this.factory);
			return dao.find(condicao);
		}
		return transactDAO.find(condicao);
	}

O código simpleDAO está assim:

public class SimpleDAO implements Application {
    
    private SessionFactory factory;
    private SimpleBean bean;
    private Session session;

    public SimpleDAO(SessionFactory factory) throws Exception{
      this.factory = factory;
    }

    public SimpleDAO(Session session) throws Exception{
      this.session = session;
    }

    public SimpleDAO(SimpleBean bean, SessionFactory factory) throws Exception{
      this.factory = factory;
      this.bean = bean;
    }
    
    public SimpleDAO(SimpleBean bean, Session session) throws Exception{
      this.bean = bean;
      this.session = session;        
    }
    
    public SimpleDAO(SimpleBean bean) throws Exception{
        this.bean = bean;
        Configuration cfg  =  new Configuration();
        cfg.addClass(bean.getClass());
        factory = cfg.buildSessionFactory();
//        System.out.println(">>> [SIMPLEDAO]("+bean.getClass().getName()+").New Factory Created:"+factory.toString());
    }

    public SimpleDAO(SimpleBean bean, Object[] objs) throws Exception{
        this.bean = bean;
        Configuration cfg  =  new Configuration();
        for (int idx=0; idx < objs.length;idx++) {
          cfg.addClass(objs[idx].getClass());
        }
        factory = cfg.buildSessionFactory();
//        System.out.println(">>> [SIMPLEDAO]("+bean.getClass().getName()+",objs).New Factory Created:"+factory.toString());
    }

public java.util.List find(String condicao) throws Exception {   
session = factory.openSession();   
//Transaction tx = session.beginTransaction();   
  
List retorno = (List)session.createCriteria(condicao);   
session.flush();   
//tx.commit();   
  
//Para fehar a conexão com o banco de dados   
session.connection().close();   
  
session.close();   
  
return retorno;   
}   
}

O código transactDAO está assim:

public class TransactDAO{
    
    private SessionFactory factory;
    public SessionFactory getFactory() {
		return factory;
	}

//	public void setFactory(SessionFactory factory) {
//		this.factory = factory;
//	}

	private Session session;
    private Transaction tx;

    public TransactDAO(SessionFactory factory) throws Exception{
      this.factory = factory;
    }
    
    public Session getSession() {
    	return this.session;
    }

    public TransactDAO(Object[] objs) throws Exception {
      Configuration cfg  =  new Configuration();
      for (int idx=0; idx < objs.length;idx++) {
        cfg.addClass(objs[idx].getClass());
      }
      factory = cfg.buildSessionFactory();
      System.out.println(">>> [TransactDAO](objs).New Factory Created:"+factory.toString());
    }

    public void beginTransaction() throws Exception {
      session = factory.openSession();
       
      tx = session.beginTransaction();     
     
    }
    public List find(String condicao) throws Exception {
    	List lista = (List) session.createCriteria(condicao);
//    	session.clear();
    	return lista;
    }
}
Criado 25 de junho de 2010
Ultima resposta 25 de jun. de 2010
Respostas 8
Participantes 2