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

Dúvida sobre Web Service Relatório de Produtos

Estou com dúvida sobre como colocar a quantidade de produtos e a data de geração do relátorio no JSON. Pensei em criar junto a query uma quantidade como:

    public List<Produto> findPorData(Calendar dataLancamento) {
        return manager.createQuery("select distinct(p), count(p.id) as quantidade from Produto p join fetch p.precos precos where p.dataLancamento >= :dataLancamento", 
                Produto.class).setParameter("dataLancamento", dataLancamento)
                .getResultList();
    }

Mas me retorna o erro de Cannot create TypedQuery for query with more than one return using requested result type ou seja não posso fazer mais de uma query no método em questão.

Como posso fazer 2 querys sejam juntas ou separadas para além de retornar a lista de produtos, possa colocar a quantidade e a data de Geração?

Sendo que meu controller só retorna uma lista de livros:

    @RequestMapping(method=RequestMethod.GET)
    @ResponseBody
    public List<Produto> detalheJson(@RequestParam(value="data", required=false) String dataLancamento) throws ParseException{


            SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
            Date date = format.parse(dataLancamento);
            Calendar cal = Calendar.getInstance();
            cal.setTime(date);
        return dao.findPorData(cal);


    }
9 respostas

Olá Marcos, tudo bem?

Uma possibilidade para contornar este problema é fazer uma query onde é retornado apenas a lista de livros e após isso definir a quantidade de livros sendo igual ao tamanho da lista de retorno, sacou?

Entendi o que vc quis dizer, mas como fazer que esse meu método detalheJson retorne não só a query dos livros, mas também retorne a query que imprimiria a quantidade de livros? digo seriam 2 querys diferentes não?

Então, o problema é que você definiu que sua query irá retornar um produto.

Mas, como seu retorno vai além do que define a entidade de um produto, ele está acusando esse erro.

ele retorna uma lista de produtos, eu só adicionei o na query a quantidade. Minha dúvida é se dar pra ver a lista de livros e a quantidade de livros em uma única query, ou tenho que fazer 2 querys separadas ?

Então, a situação é que em

return manager.createQuery("select distinct(p), count(p.id) as quantidade from Produto p join fetch p.precos precos where p.dataLancamento >= :dataLancamento", 
                Produto.class)...

Está mapeado para uma entidade Produto.class.

Você tem duas possibilidades. Ou realmente executa duas querys ou cria uma classe que contenha as duas informações (a lista de livros e a quantidade) e a define em:

return manager.createQuery("select distinct(p), count(p.id) as quantidade from Produto p join fetch p.precos precos where p.dataLancamento >= :dataLancamento", 
                ClasseQueContemAsDuasInfos.class)...

No caso se eu criasse 2 querys, como faria para meu método detalheJson retornar ambas as querys ?

Seria uma ideia bem próxima ali de cima:

Bastaria alterar o tipo do retorno de seu método detalheJson para uma classe Relatorio por exemplo.

Nessa classe teriam atributos como uma lista de produtos, quantidade...

solução!

Ex:

@RequestMapping(method=RequestMethod.GET)
    @ResponseBody
    public Relatorio detalheJson(@RequestParam(value="data", required=false) String dataLancamento) throws ParseException{


            SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
            Date date = format.parse(dataLancamento);
            Calendar cal = Calendar.getInstance();
            cal.setTime(date);
            Relatorio relatorio = new Relatorio() ;
            relatorio.setLista(dao.findLista());
            relatorio.setQuantidade(dao.findQuant());
            .... 
            return relatorio;


    }

Funcionou! Criei a classe Relatorio e fiz 2 querys separados. Muito obrigado!