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

Dúvida - Aula 3 - Exercício <Valor inicial médio dos leilões em que o usuário deu pelo menos um lance>

Olá, ao fazer o teste para o código abaixo ele não passa, blz. Minha dúvida é como alterar a consulta pra que funcione corretamente, fiz alguns testes mas nada deu certo.

public double getValorInicialMedioDoUsuario(Usuario usuario) {
        return (Double) session.createQuery("select avg(lance.leilao.valorInicial) " +
                                            "from Lance lance " +
                                            "where lance.usuario = :usuario")
                    .setParameter("usuario", usuario)
                    .uniqueResult();
    }
@Test
    public void devolveAMediaDoValorInicialDosLeiloesQueOUsuarioParticipou(){
        Usuario dono = new Usuario("Mauricio", "m@a.com");
        Usuario comprador = new Usuario("Victor", "v@v.com");
        Leilao leilao = new LeilaoBuilder()
            .comDono(dono)
            .comValor(50.0)
            .comLance(Calendar.getInstance(), comprador, 100.0)
            .comLance(Calendar.getInstance(), comprador, 200.0)
            .constroi();
        Leilao leilao2 = new LeilaoBuilder()
            .comDono(dono)
            .comValor(250.0)
            .comLance(Calendar.getInstance(), comprador, 100.0)
            .constroi();
        usuarioDao.salvar(dono);
        usuarioDao.salvar(comprador);
        leilaoDao.salvar(leilao);
        leilaoDao.salvar(leilao2);

        assertEquals(150.0, leilaoDao.getValorInicialMedioDoUsuario(comprador), 0.001);
    }
4 respostas

Oi Stephannie , está falhando por qual motivo?

Olá Alberto, a query deveria pegar cada leilão apenas uma vez e calcular a média dos valores iniciais, porém está pegando o primeiro leilão 2 vezes pois ele tem 2 lances.

solução!

Stephannie,

O problema da query é que ela faz o SELECT na tabela Lance e filtra por usuário, nesse caso ele vai acabar selecionando os dois lances do mesmo leilão.

Tenta inverter a lógica, começa selecionando os leilões que possuam pelo menos um lance do usuário especificado. Eu acabei usando a condição EXISTS, mas talvez tenha uma maneira mais otimizada disso.

Olá Yuri, tinha conseguido resolver dessa forma mesmo, invertendo a lógica. Valeu