Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

Melhores práticas para retorno de resultados com JPQL

Olá Pessoal, Preciso de uma ajuda nesse código referente a melhor forma de retornar dados de uma consulta JPQL abaixo. Eu preciso especificamente de dois campos de objetos relacionados, mas não estou certo se é melhor pratica retornar o objeto somente com dois campos alimentados.

    public LocalDE localizaPorItemEstoqueDeposito(final BigInteger ItemId, 
                                                  final BigInteger estoqueId, 
                                                  final BigInteger depositoId){

        StringBuilder sql = new StringBuilder();

        sql.append(" SELECT ")
           .append("     a.bkLocationC, ")
           .append("     b.bkStockTypeC ") 
           .append("   FROM LocalDE c ") 
           .append("     JOIN c.partsXWarehouseDE d ")
           .append("     JOIN c.depositoDE a  ")
           .append("     JOIN c.tipoDepositoDE b ")
           .append("   WHERE ")
           .append("      d.ItemId = :ItemId AND")
           .append("      d.estoqueId = :estoqueId AND") 
           .append("      d.bkdepositoId  = :depositoId ");          

        TypedQuery<LocalDE> query = this.entityManager().createQuery(sql.toString(), LocalDE.class);

        query.setParameter("ItemId", ItemId);
        query.setParameter("estoqueId", estoqueId);
        query.setParameter("depositoId", depositoId);

        @SuppressWarnings("unchecked")
        List lstItemxEstoquexDeposito = query.getResultList();
        java.util.Iterator it = lstItemxEstoquexDeposito.iterator(); 

        LocalDE itemxEstoquexDeposito = new LocalDE();
        DepositoDE deposito = new DepositoDE();
        TipoDepositoDE  tipoDeposito = new TipoDepositoDE();

        while(it.hasNext()) {
            Object[] resultitemxEstoquexDeposito =(Object[]) it.next();

            deposito.setDepositoDesc(String.valueOf(resultitemxEstoquexDeposito[0]));
            tipoDeposito.setTipoDepositoDesc(String.valueOf(resultitemxEstoquexDeposito[1]));

            itemxEstoquexDeposito.setdepositoDE(deposito);
            itemxEstoquexDeposito.settipoDepositoDE(tipoDeposito);
        }

        return itemxEstoquexDeposito;

    }
2 respostas
solução!

Criar um objeto só para retorno é uma boa prática, embora alguns achem esquisito (eu incluido). Uma outra implementação seira um Map<String,Object> com os objetos... Recomendo então trocar o nome da classe para RetornoLocalizaPorItemEstoqueDeposito para que deixe claro o objetivo do objeto

PS: trocaria @SuppressWarnings("unchecked") por uma implementação try...catch

Francisco obrigado pelo retorno. Vou aplicar a dica. Abraço.