Estou com problemas ao utilizar uma função do postgres.
Utilizo JPA e escrevo as consultas com Querydsl
Segue código
NumberPath<Long> codigoEmpresa = QueryDSLUtil.createNumber(agendamentoBonoDTO.codigoEmpresa);
NumberPath<Long> codigoFornecedorNota = QueryDSLUtil.createNumber(agendamentoBonoDTO.codigoFornecedorNota);
NumberPath<Long> codigoFornecedorPedido = QueryDSLUtil.createNumber(agendamentoBonoDTO.codigoFornecedorPedido);
StringPath nomeFornecedorNota = QueryDSLUtil.createString(agendamentoBonoDTO.nomeFornecedorNota);
StringPath nomeFornecedorPedido = QueryDSLUtil.createString(agendamentoBonoDTO.nomeFornecedorPedido);
NumberPath<Long> numeroBono = QueryDSLUtil.createNumber(agendamentoBonoDTO.numeroBono);
NumberPath<Long> numeroDoca = QueryDSLUtil.createNumber(agendamentoBonoDTO.numeroDoca);
NumberPath<Long> numeroNota = QueryDSLUtil.createNumber(agendamentoBonoDTO.numeroNota);
StringPath numeroPedido = QueryDSLUtil.createString(agendamentoBonoDTO.numeroPedido);
NumberPath<Long> quantidadeItens = QueryDSLUtil.createNumber(agendamentoBonoDTO.quantidadeItens);
NumberPath<Long> codigoConferente = QueryDSLUtil.createNumber(agendamentoBonoDTO.codigoConferente);
StringPath nomeConferente = QueryDSLUtil.createString(agendamentoBonoDTO.nomeConferente);
DatePath<Date> dataReferencia = createDate(Date.class, agendamentoBonoDTO.dataReferencia);
DateTimePath<Date> horaInicio = createDateTime(Date.class, agendamentoBonoDTO.horaInicio);
DateTimePath<Date> horaTermino = createDateTime(Date.class, agendamentoBonoDTO.horaTermino);
StringPath nomeMotorista = QueryDSLUtil.createString(agendamentoBonoDTO.nomeMotorista);
StringPath nomeTransportadora = QueryDSLUtil.createString(agendamentoBonoDTO.nomeTransportadora);
StringPath numeroPlaca = QueryDSLUtil.createString(agendamentoBonoDTO.numeroPlaca);
NumberPath<Long> docaStatus = QueryDSLUtil.createNumber(agendamentoBonoDTO.docaStatus);
PathBuilder<String> aliasExterno = new PathBuilder<String>(String.class, "pagamentos");
NumberPath<Long> count = QueryDSLUtil.createNumber(new StaticType<Long>(Long.class, "count"));
NumberPath<Long> numeroBonoSub = QueryDSLUtil.createNumber(new StaticType<Long>(Long.class, "numeroBonoSub"));
NumberPath<Long> codigoEmpresaSub = QueryDSLUtil.createNumber(new StaticType<Long>(Long.class, "codigoEmpresaSub"));
QItensAgendamentoBonoPK itensAgendamentoBonoPK = new QItensAgendamentoBonoPK(itensAgendamentoBono.getMetadata().getName());
QAgendamentoBonoPK agendamentoBonoPK = new QAgendamentoBonoPK(agendamentoBono.getMetadata().getName());
QTransacionador fornecedorPedido = new QTransacionador("fornecedorPedido");
QTransacionador fornecedorNota = new QTransacionador("fornecedorNota");
JPASubQuery subQuery = new JPASubQuery().from(itensAgendamentoBono).innerJoin(agendamentoBono)
.on(itensAgendamentoBonoPK.codigoEmpresa.eq(agendamentoBonoPK.codigoEmpresa)
.and(itensAgendamentoBonoPK.numeroBono.eq(agendamentoBonoPK.numeroBono)))
.leftJoin(pedido)
.on(pedido.codigoEmpresa.eq(itensAgendamentoBonoPK.codigoEmpresa)
.and(pedido.numeroPedido.eq(itensAgendamentoBonoPK.codigoSequencial)))
.groupBy(itensAgendamentoBonoPK.codigoEmpresa, itensAgendamentoBonoPK.numeroBono);
StringExpression agrupamento = QueryDSLUtil.concatGroup(pedido.numeroPedido.stringValue(), ",");
JPASQLQuery query = sqlFrom().leftJoin(fornecedorPedido).on(agendamentoBono.fornecedorPedido.eq(fornecedorPedido.id)).leftJoin(usuario)
.on(agendamentoBono.codigoConferente.eq(usuario.id)).innerJoin(transacionador)
.on(agendamentoBonoPK.codigoEmpresa.eq(transacionador.id)).leftJoin(fornecedorNota)
.on(agendamentoBono.fornecedorNota.eq(fornecedorNota.id))
.leftJoin(subQuery.list(itensAgendamentoBonoPK.codigoProduto.countDistinct().as(count),
itensAgendamentoBonoPK.codigoEmpresa.as(codigoEmpresaSub), itensAgendamentoBonoPK.numeroBono.as(numeroBonoSub),
agrupamento.as(numeroPedido)), aliasExterno)
.on(agendamentoBonoPK.codigoEmpresa.eq(codigoEmpresaSub).and(agendamentoBonoPK.numeroBono.eq(numeroBonoSub)))
.where(agendamentoBonoPK.codigoEmpresa.eq(empresa));
return QueryDSLUtil.listOf(AgendamentoBonoDTO.class,
query.list(agendamentoBonoPK.codigoEmpresa.as(codigoEmpresa), agendamentoBono.numeroDoca.as(numeroDoca),
agendamentoBonoPK.numeroBono.as(numeroBono), agendamentoBono.numeroNota.as(numeroNota), count.as(quantidadeItens),
agendamentoBono.dataCadastro.as(dataReferencia), agendamentoBono.horaInicio.as(horaInicio),
agendamentoBono.horaFim.as(horaTermino), agendamentoBono.numeroPlaca.as(numeroPlaca),
transacionador.razaoSocial.as(nomeTransportadora), agendamentoBono.nomeMotorista.as(nomeMotorista),
fornecedorPedido.razaoSocial.as(nomeFornecedorPedido), agendamentoBono.fornecedorPedido.as(codigoFornecedorPedido),
agendamentoBono.fornecedorNota.as(codigoFornecedorNota), fornecedorNota.razaoSocial.as(nomeFornecedorNota),
agendamentoBono.codigoConferente.as(codigoConferente), usuario.nome.as(nomeConferente), numeroPedido));
O problema é o numero do pedido uso uma função de agregação.
StringExpression agrupamento = QueryDSLUtil.concatGroup(pedido.numeroPedido.stringValue(), ",");
public static StringExpression concatGroup(Expression<?> expr, String agrupador) {
return StringTemplate.create("string_agg({0}, '{1s}')", expr, agrupador);
}
A consulta retorna porém com este valor em branco.
A mesma consulta executada no banco retorna dados na coluna numeroPedido