Querydsl with Abstract class

Asked

Viewed 129 times

0

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

I would just like to know if queryDSL cannot 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;
}
  • 1

    Could you put your code to see if the question becomes a little clearer?

1 answer

2

Well, assuming that QDadoLidoGraficoDTO:

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

Your problem is further down:

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

Which means that in Java this is not a valid assignment:

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

But you can use one 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

Soon, 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));

Browser other questions tagged

You are not signed in. Login or sign up in order to post.