Hibernate - Cadastrar com Busca

6 respostas
J

Olá gelara do fórum, sou comecei a pouco tempo a usar o Hibernate
e estou com uma dúvida…

Quero saber como pesquisar um determinado objeto no banco
e NÂO inserir caso já o mesmo não exista. No aplicação antiga
(com SQL dentro do código) ficava assim:

//ESSE CÓDIGO É PARA MOSTRAR APENAS UMA IDÉIA DO QUE EU QUERO  
      
    Aluno novoAluno =  new Aluno();  
    novoAluno.setNome("Joãozinho");  
    novoAluno.setMatricula(23625);  
      
    String sql = "Select * from aluno where matricula = ?";  
      
      
   stmt.setLong(Long.parseLong(novoAluno.getMatricula()));  
     
      
   PreparedStatement stmt = con.prepareStatement();  
     
     
  ResultSet rs = stmt.executeQuery(sql);  
     
   if(!rs.next){  
    
      //Lógica para cadastro do Aluno  
     
   }else{  
     
     
      System.out.println("Não é possível cadastrar! Já existe um Aluno com a mesma MATRÍCULA!!!")  
     
   }  
     
   //OU SEJA, PRIMEIRO EU FAZIA UMA BUSCA NO BANCO, CASO NÃO EXISTISSE UM ALUNO COM AQUELA MATRICULA  
  //O CADASTRO ERA EFETUADO, CASO CONTRÁRIO INFORMAVA AO USUÁRIO QUE JÁ EXISTIA UM ALUNO COM AQUELA MÁTRICULA

Minha pergunta é, eu JÁ SEI SALVAR O OBJETO NO BANCO COM O HIBERNATE, mas como fazer uma busca
(como mostrada acima) e salvar APENAS se o obejeto ainda não existir???

Agradeço desde já!!!

6 Respostas

softwork

jonhzihnhoOo:
Olá gelara do fórum, sou comecei a pouco tempo a usar o Hibernate
e estou com uma dúvida…

Quero saber como pesquisar um determinado objeto no banco
e NÂO inserir caso já o mesmo não exista. No aplicação antiga
(com SQL dentro do código) ficava assim:

//ESSE CÓDIGO É PARA MOSTRAR APENAS UMA IDÉIA DO QUE EU QUERO  
      
    Aluno novoAluno =  new Aluno();  
    novoAluno.setNome("Joãozinho");  
    novoAluno.setMatricula(23625);  
      
    String sql = "Select * from aluno where matricula = ?";  
      
      
   stmt.setLong(Long.parseLong(novoAluno.getMatricula()));  
     
      
   PreparedStatement stmt = con.prepareStatement();  
     
     
  ResultSet rs = stmt.executeQuery(sql);  
     
   if(!rs.next){  
    
      //Lógica para cadastro do Aluno  
     
   }else{  
     
     
      System.out.println("Não é possível cadastrar! Já existe um Aluno com a mesma MATRÍCULA!!!")  
     
   }  
     
   //OU SEJA, PRIMEIRO EU FAZIA UMA BUSCA NO BANCO, CASO NÃO EXISTISSE UM ALUNO COM AQUELA MATRICULA  
  //O CADASTRO ERA EFETUADO, CASO CONTRÁRIO INFORMAVA AO USUÁRIO QUE JÁ EXISTIA UM ALUNO COM AQUELA MÁTRICULA

Minha pergunta é, eu JÁ SEI SALVAR O OBJETO NO BANCO COM O HIBERNATE, mas como fazer uma busca
(como mostrada acima) e salvar APENAS se o obejeto ainda não existir???

Agradeço desde já!!!

Amigo, vou tentar lhe ajudar.
Presumindo que você já tenha um DAO (específico ou genérico) e que neste haja um método de procura como no exemplo abaixo, basta então verificar o retorno se for igual a nulo, caso contrário a mensagem deverá ser apresentada.

DAO genérico:

public T localizar(T obj, String... fields) {
        Criteria c = createCriteria();
        for (String field : fields) {
            Method m = null;
            Object val = null;
            try {
                m = clazz.getMethod("get" + modifica(field));
                val = m.invoke(obj);
                c.add(Restrictions.eq(field, val));
            } catch (Exception e) {
                // logger.error(e.getMessage(), e);
            }
        }
        T result = (T) (c.list() != null && c.list().size() >= 1 ? c.list().get(0) : null);
        return result;
    }

Exemplo de uso:

// Você poderá receber o objeto aluno injetado pelo vRaptor, mas no código abaixo esta sendo informado como Hardcod.
    Aluno aluno =  new Aluno();  
    aluno.setNome("Joãozinho");  
    aluno.setMatricula(23625);  
    aluno.set...(...);  

   if (this.daoFactory.getAlunoDao().localizar(aluno, "matricula") == null) {
      ... // Iniciar uma transação com o banco
      ...
      this.daoFactory.getAlunoDao().adiciona(aluno);
      ...
      ... // Finalizar uma transação com o banco
   } else {
      ...
      System.out.println("Não é possível cadastrar! Já existe um Aluno com a mesma MATRÍCULA!!!") 
      ...
   }

Espero ter ajudado a tomar uma decisão.

Boa sorte.

vinicius.martinez

Na verdade…se no seu banco de dados voce tentar inserir um aluno com a matrícula já existente (supondo que voce tenha a matrícula como PK ou com unique index) , o banco irá retornar uma exception…

Ai voce trata da forma que voce quiser

Lavieri

Com hibernate ?? já sabe pegar uma session ?? se souber.... fica simples.... pode ser feito assim

public boolean add(Aluno aluno) {
   Integer count = (Integer)session
      .createCriteria(Aluno.class)
      .add(Restrictions.eq("matriculo",aluno.getMatricula())
      .setProjection(Projections.rowCount())
      .uniqueResult();

   if (count <= 0)
      return false;

   session.marge(aluno);
   return true;
}
J
Lavieri:
Com hibernate ?? já sabe pegar uma session ?? se souber.... fica simples.... pode ser feito assim
public boolean add(Aluno aluno) {
   Integer count = (Integer)session
      .createCriteria(Aluno.class)
      .add(Restrictions.eq("matriculo",aluno.getMatricula())
      .setProjection(Projections.rowCount())
      .uniqueResult();

   if (count <= 0)
      return false;

   session.marge(aluno);
   return true;
}

..................

Já sei usar Session, mas os que significam as linhas de código abaixo:

.setProjection(Projections.rowCount())
.uniqueResult();

Valeu desde já!!

Lavieri
jonhzihnhoOo:
..................

Já sei usar Session, mas os que significam as linhas de código abaixo:

.setProjection(Projections.rowCount())
.uniqueResult();

Valeu desde já!!

vamo lá.... basicamente se soube ler inglês fica fácil ler um Criteria... então vamos ver...

/**
  * Adiciona um aluno, caso este ainda não esteja matriculado, retornando se o aluno foi adicionado ou não.
  * @return true - caso adicione o aluno<br/> false - caso o aluno não seja adicionado, pois  existe no banco.
  */
 public boolean  add(Aluno aluno) {  

    Integer count = (Integer)session  //a partir de uma sessão

       .createCriteria(Aluno.class)       //crie um crieterio para buscar alunos

       .add(Restrictions.eq(&quot;matriculo&quot;,aluno.getMatricula())  // adicione a restrição da propriedade matricula ser igual a aluno.getMatricula()

       .setProjection(Projections.rowCount())  //agora altera a projeção da resposta para uma contagem da quantidade de resultados (caso isso não fosse feito, o que seria retornado seria uma lista de Alunos que satisfizessem o criterio.

       .uniqueResult();  //retorne o único resultado da consulta, afinal ela é um rowCount, e tranforme ela em um Interiro (isso é feito no cast la no inicio do código, antes da session) guardando dentro da variável count.
   
    if (count &gt; 0)  //se quantidade de linhas for maior que zero, quer dizer que  existe alunos com essa matricula

       return false;  //portanto retorne falso, pois não sra adicionado nada.
   
    session.marge(aluno);  // adicione o aluno ao banco
    return true;  // retorne verdade
 }
J

Valeu mesmo Lavieri, o código funcionou perfeitamente!!! :smiley:

Brigadão

Criado 1 de março de 2010
Ultima resposta 2 de mar. de 2010
Respostas 6
Participantes 4