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

Consulta com Criteria API

Não sei o nome desse comportamento em JPA, não sei nem dizer o nome dessa funcionalidade, mas vou explicar e acho que conseguirão me entender.

Eu costumo fazer muita análise de dados e eu preciso criar objetos diferentes a partir de outras tabelas, por exemplo:

Tenho a seguinte entidade:

@Entity
public class Fatura{    

    private Double valor;
}

pra pegar todos os valores e gerar um objeto FaturaTotal, eu faria.

String jpql = select new FaturaTotal(sum(f.valor))  from Fatura f";

essa funcionalidade de gerar um objeto diferente(que não é uma entidade) a partir de uma entidade, é possível com Criteria Api? Como?

Esse exemplo é bem simples e poderia ser feito de outra forma, mas minha dúvida é em cima dessa ideia de poder dar um

new ObjetoDiferenteDaEntidade()

na query e passar informações dessa Entidade para o construtor desse ObjetoDiferenteDaEntidade e gerar um List disso, talvez.

5 respostas
solução!

Olá,

É possível fazer isso com o método construct do CriteriaBuilder.

Dê uma olhada nesse exemplo: https://docs.jboss.org/hibernate/entitymanager/3.5/reference/en/html/querycriteria.html#querycriteria-typedquery-construct

Nele é feito um select na entidade Person e o resultado é transformado na classe PersonWrapper. Veja que dentro do select ele chama o builder.contruct(classe, argumentos..).

Então o nome seria wrapper?

O nome da classe tanto faz, PersonWrapper é só um exemplo.

Podes usar o construct para transformar pra tua classe FaturaTotal.

Sim, isso eu entendi, thanks! Ajudou muito!

Mas essa ideia de gerar um novo objeto diferente da entidade é Wrapper?

Ah, entendi! Desculpe. Então, acho que não existe uma convenção pra nomenclatura.

Aqui na empresa costumamos transformar em DTO, por exemplo temos a entidade Pessoa, e quando queremos encapsular os dados da pessoa com mais outras informações do select, criamos uma classe PessoaDTO.

Mais sobre DTO: https://pt.wikipedia.org/wiki/Objeto_de_Transfer%C3%AAncia_de_Dados