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

Query para retornar apenas um atributo da entidade

@Entity
public class Transacao {
    private List<Item> item;    
}
manager.createQuery("SELECT t.item FROM Transacao t WHERE t.id=:id", Object[].class)
            .setParameter("id", id)
            .getSingleResult();

Gostaria de retornar um array de item (Se possível uma lista) ao invés de um array de object. Agradeço desde já

6 respostas

Já experimentou trocar de Object[].class para Item.class? Eu não vi nada de errado na sua query.

Tentei Isso

List<Item> resultList = manager.createQuery("SELECT t.item FROM Transacao t WHERE t.id=:id", Item.class)
                .setParameter("id", id)
                .getResultList();

Mas deu este erro

Type specified for TypedQuery [br.com.kelvin.sistema.modelo.Item] is incompatible with query return type [interface java.util.Collection]

Se eu utilizar dessa forma, tudo ocorre bem \/

List<Object> resultList = manager.createQuery("SELECT t.item FROM Transacao t WHERE t.id=:id", Object.class)
                .setParameter("id", id)
                .getResultList();

Ahhh, item é uma coleção... Ele realmente vai te retornar um Array de coleções de itens... Não vai rolar ele te retornar uma lista de itens.. Dado que vc retorna algo como List>

Então terei que fazer um cast mesmo? Ou há a possibilidade de fazer um select new para arrayList?

Desde já, muito obrigado pela atenção!

Não da para fazer cast.. Cast não converte objetos, só permite que vc referencie eles através de outros tipos. O tipo retornado pela sua query é um List<List<Item>>. Você não pode fazer cast disso para List<Item>... Bom, o compilador até vai permitir, mas vc não ter o resultado que espera.

Você precisa é mudar a query e buscar a partir do Item, não da Transacao.

solução!

Eu fiz o cast depois, como o método é pequeno e não irá crescer (assim espero), não terei problemas em entender. Aparentemente tudo ocorreu bem.

public double buscaTotal(int id) {
        List<Object> resultList = manager.createQuery("SELECT t.item FROM Transacao t WHERE t.id=:id", Object.class)
                .setParameter("id", id)
                .getResultList();
        return resultList.stream().mapToDouble(i -> ((Item) i).getTotal()).sum();
    }

Mas ainda tenho uma dúvida, eu devo utilizar mesmo o getResultList() ou devo usar o getSingleResult()? A query irá retornar uma lista de Itens, mas apenas de um registro, pois especifiquei o ID.