QueryDSL with abstract class

0

I need to make a query that returns an abstract object. In case when my code arrives in the ".list ()" it throws an exception, on the other hand, if I use ".list" but returning an attribute of this object it works.

I just want to know if queryDSL can not return an abstract object

public List<DadoLidoGraficoDTO> buscarDadosDosGraficosGerenciais(List<Long> estacoes, Date dataInicio, Date dataFim, Integer tipoDado) {
    QDadoLidoEstacao entidade = QDadoLidoEstacao.dadoLidoEstacao;
    QLeituraEstacao entidadeLeitura = QLeituraEstacao.leituraEstacao;

    JPAQuery query = new JPAQuery(em);

    List<DadoLidoGraficoDTO> resultado = query.from(entidade)
         .innerJoin(entidade.leituraestacao, entidadeLeitura)
         .where(entidadeLeitura.coletorDados.id.in(estacoes).and(entidade.dataHora.between(dataInicio, dataFim).and(entidade.tipoDado.identificadorTipo.eq(tipoDado))))
         .groupBy(entidadeLeitura.coletorDados.id, entidade.dataHora.month(), entidade.dataHora.dayOfMonth(), entidade.dataHora)
         .orderBy(entidade.dataHora.asc())
         .list(new QDadoLidoGraficoDTO(entidadeLeitura.coletorDados, entidade.valor.sum(), entidade.dataHora));

    return resultado;
}
    
asked by anonymous 05.02.2014 / 15:36

1 answer

2

Good, assuming that QDadoLidoGraficoDTO :

  • is a concrete class
  • inherits from the superclass DadoLidoGraficoDTO (whether abstract or not)
  • has a constructor with three parameters (compatible with arguments being passed) duly annotated with @QueryProjection ( Reference Documentation - Querydsl )

Your problem is further down:

Generic types in Java are invariants , ie List<QDadoLidoGraficoDTO> is not a subtype of List<DadoLidoGraficoDTO> ( The Java ™ Tutorials - Generics, Inheritance, and Subtypes ).

Meaning that in Java this is not a valid assignment:

List<DadoLidoGraficoDTO> l1 = // ...
List<QDadoLidoGraficoDTO> l2 = // ...
l1 = l2; // inválido - não compila

However, you can use a wildcard to say that DadoLidoGraficoDTO is an upper limit of the expected type (The Java ™ Tutorials - Wildcards and Subtyping :

List<? extends DadoLidoGraficoDTO> l1 = // ...
List<QDadoLidoGraficoDTO> l2 = // ...
l1 = l2; // ok QDadoLidoGraficoDTO é um subtipo de DadoLidoGraficoDTO

So you can do the following:

List<? extends DadoLidoGraficoDTO> resultado = query.from(entidade)
     .innerJoin(entidade.leituraestacao, entidadeLeitura)
     .where(entidadeLeitura.coletorDados.id.in(estacoes).and(entidade.dataHora.between(dataInicio, dataFim).and(entidade.tipoDado.identificadorTipo.eq(tipoDado))))
     .groupBy(entidadeLeitura.coletorDados.id, entidade.dataHora.month(), entidade.dataHora.dayOfMonth(), entidade.dataHora)
     .orderBy(entidade.dataHora.asc())
     .list(new QDadoLidoGraficoDTO(entidadeLeitura.coletorDados, entidade.valor.sum(), entidade.dataHora));
    
06.02.2014 / 23:48