Ola,
Eu estou usando spring-data jpa e tenho esse metodo. Eu uso uma classe ProdutoFilter que tem todos os parametros de pesquisa, e montei a query de forma nativa. Gostaria de saber se tem como refatorar esse metodo, para que o framework entenda que os parametros da query sao para retirar de ProdutoFilter ao inves de ter que passa-los um a um no metodo. Fica muito feio. Eu tentei usar uma outra abordagem que achei que melhor, porem nao funcionou como esperado.
O metodo é esse:
@Query(value = "select p.idproduto as idproduto, p.ean as ean, "
+ "p.descricao as descricao, p.unidsaida as unidade,"
+ " p.embsaida as embalagem, pp.custozero as precoCusto,pp.margem as margemLucro,pp.venda1 as precoVenda,"
+ " substring(p.tabicmsprod,1,2) as cstIcms, idgrupo as secao, idsubgrupo as grupo, idsubgrupo1 as subgrupo"
+ " from produto p inner join itensfornecedor pf on p.idproduto=pf.idproduto"
+ " inner join produto_preco pp on p.idproduto=pp.idproduto "
+ " where (pf.idfornecedor = :idFornecedor or :idFornecedor is null)"
+ " and (pp.id_loja =:idLoja or :idLoja is null)"
+ " and (p.idProduto = :idProduto or :idProduto is null)"
+ " and (p.idGrupo = :idGrupo or :idGrupo is null)"
+ " and (p.idSubGrupo = :idSubGrupo or :idSubGrupo is null)"
+ " and (p.idSubGrupo1 = :idSubGrupo1 or :idSubGrupo1 is null)"
+ " and (p.descricao like concat(:descricao, '%') or :descricao is null)"
+ " and (p.produto_cotacao = :participaCotacao or :participaCotacao is null)"
+ " and (pp.idFamilia = :idFamilia or :idFamilia is null)"
+ " and (p.idSituacao = :idSituacao or :idSituacao is null)"
+ " order by p.descricao , nativeQuery = true)
public List<PedidoCompraItem> listarItensPedidoCompra(@Param("idProduto") Long idProduto, @Param("idLoja") Long idLoja,
@Param("idFornecedor") Long idFornecedor, @Param("idGrupo") Long idSecao, @Param("idSubGrupo") Long idGrupo,
@Param("idSubGrupo1") Long idSubgrupo, @Param("descricao") String descricao, @Param("participaCotacao") String participaCotacao,
@Param("idFamilia") Long idFamilia, @Param("idSituacao") Long idSituacao);
Essa é a forma que esta hoje, eu tentei uma abordagem usando criteria inclusive recebe warning de deprecated, porem a query nao funciona da forma que eu implementei o select. Mas ficou assim:
@SuppressWarnings("unchecked")
@Override
@Transactional(readOnly = true)
public Page<Produto> filtrarPrecoPendente(ProdutoFilter produtoFilter, Pageable pageable) {
Criteria criteria = manager.unwrap(Session.class).createCriteria(Produto.class);
paginacaoUtil.preparar(criteria, pageable);
adicionarFiltro(produtoFilter, criteria);
return new PageImpl<>(criteria.list(), pageable, total(produtoFilter));
}
private Long total(ProdutoFilter filtro) {
Criteria criteria = manager.unwrap(Session.class).createCriteria(Produto.class);
adicionarFiltro(filtro, criteria);
criteria.setProjection(Projections.rowCount());
return (Long) criteria.uniqueResult();
}
private void adicionarFiltro(ProdutoFilter filtro, Criteria criteria) {
if (filtro != null) {
if (!StringUtils.isEmpty(filtro.getDescricao())) {
criteria.add(Restrictions.ilike("descricao", filtro.getDescricao(), MatchMode.ANYWHERE));
}
if (filtro.getIdSecao() != 0) {
criteria.add(Restrictions.eq("idgrupo", filtro.getIdSecao()));
}
if (filtro.getIdGrupo() != null) {
criteria.add(Restrictions.eq("idsubgrupo", filtro.getIdGrupo()));
}
if (filtro.getIdSubgrupo() != null) {
criteria.add(Restrictions.eq("idsubgrupo1", filtro.getIdSubgrupo()));
}
if (filtro.getEntradaDe() != null) {
criteria.add(Restrictions.ge("dt_entrada", filtro.getEntradaDe()));
}
if (filtro.getEntradaAte() != null) {
criteria.add(Restrictions.le("dt_entrada", filtro.getEntradaAte()));
}
}
}
essa abordagem fica mais legível, mas nao funcionou bem. Por isso gostaria de saber se alguem tem uma sugestao de como refatorar esse metodo.