Versão atual:

Paginacao usando distinct do criteria

Estou implementando uma busca paginada usando a api criteria do hibernate. Alguns problemas relacionados ao numero de resultados estão acontecendo. quando eu uso o setMaxResults(10) com o DISTINCT_ROOT_ENTITY a busca retorna apenas 5 resultados, mas tirando o distinct, ele retorna 10, mas alguns elementos repetidos.

Estou um pouco confuso porque era pra ele retornar 10 resultados não repetidos.

Não entendi muito bem esse comportamento , por isso gostaria que alguém me ajudasse a resolver isso!

aqui segue o código:

public List<TbProduto> findByEscopoProdutoPaginado(ParametroBuscaProduto param) {
        Criteria criteria = createCriteria();

        criteria.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);
        if (param != null) {

            if (param.getMarca() != null && param.getMarca() != -1) {
                criteria.createAlias("marcaFornecedor", "marcaFornecedor");
                criteria.add(Restrictions.eq("marcaFornecedor.codigo",
                        param.getMarca()));
            }

            if (param.getGrupo() != null && !param.getGrupo().equals("-")) {
                criteria.createAlias("grupo", "grupo");
                criteria.add(Restrictions.eq("grupo.grupo", param.getGrupo()));
            }

            if (param.getSubGrupo() != null && !param.getSubGrupo().equals("-")) {
                criteria.createAlias("subgrupo", "subgrupo");
                criteria.add(Restrictions.eq("subgrupo.subGrupo",
                        param.getSubGrupo()));
            }

            if (param.getDescricao() != null
                    && !param.getDescricao().equals("")) {
                criteria.add(Restrictions.ilike("descricao",
                        "%" + param.getDescricao() + "%"));
            }



        }
        criteria.setMaxResults(10);
        List<TbProduto> lista = criteria.list();
        return lista;

    }

ESTRUTURA DAS CLASSES: TbProduto .



@Entity
@Table(schema = "estoque", name = "cdprodut")
@EqualsAndHashCode(exclude = { "listaTabelaPrecos",
        "listaTbEstoqueAlmoxarifados", "listaMovimentosEstoqueProduto" })
@Getter
@Setter
public class TbProduto implements Serializable {


    /**
     * Serial
     */
    private static final long serialVersionUID = 1770316780513100194L;

    @Id
    @Column(name = "refereprodut", columnDefinition = "refere")
    private String referencia;

    @OneToMany(mappedBy = "referencia", cascade = CascadeType.ALL, fetch = FetchType.EAGER, orphanRemoval = true)
    @BatchSize(size=10)
    private List<TbTabelaPreco> listaTabelaPrecos = new ArrayList<TbTabelaPreco>();

    @OneToMany(mappedBy = "tbReferenciaProduto", cascade = CascadeType.ALL, fetch = FetchType.EAGER, orphanRemoval = true)
    @BatchSize(size=10)
    private Set<TbEstoqueAlmoxarifado> listaTbEstoqueAlmoxarifados = new HashSet<TbEstoqueAlmoxarifado>();

    @OneToMany(mappedBy = "tbProduto")
    private List<TbProdutosMovimentoEstoque> listaMovimentosEstoqueProduto = new ArrayList<TbProdutosMovimentoEstoque>();

    @ManyToOne
    @JoinColumn(name = "fluxosaida", referencedColumnName = "codigofluxo")
    private TbFluxoCaixa fluxoSaida = new TbFluxoCaixa();

    @ManyToOne
    @JoinColumn(name = "fluxoentrad", referencedColumnName = "codigofluxo")
    private TbFluxoCaixa fluxoEntrada = new TbFluxoCaixa();

    @ManyToOne
    @JoinColumn(name = "ancorafornec", referencedColumnName = "codigofornec")
    private TbFornecedor ancoraFornecedor = new TbFornecedor();

    @ManyToOne
    @JoinColumn(name = "marca", referencedColumnName = "codigofornec", nullable = false)
    @NotNull
    private TbFornecedor marcaFornecedor = new TbFornecedor();

    @ManyToOne
    @JoinColumns({
            @JoinColumn(name = "tabelaif", referencedColumnName = "codigotabela"),
            @JoinColumn(name = "aliquoimpresfiscal", referencedColumnName = "elementabela") })
    private TbItemTabelaGenerica aliquotaImpressoraFiscal = new TbItemTabelaGenerica();

    @ManyToOne
    @JoinColumns({
            @JoinColumn(name = "tabelaun", referencedColumnName = "codigotabela"),
            @JoinColumn(name = "unidadprodut", referencedColumnName = "elementabela") })
    private TbItemTabelaGenerica unidade = new TbItemTabelaGenerica();

    @ManyToOne
    @JoinColumns({
            @JoinColumn(name = "tabelacv", referencedColumnName = "codigotabela"),
            @JoinColumn(name = "tabelacomiss", referencedColumnName = "elementabela") })
    private TbItemTabelaGenerica comissao = new TbItemTabelaGenerica();

    @ManyToOne
    @JoinColumns({
            @JoinColumn(name = "tabelatp", referencedColumnName = "codigotabela"),
            @JoinColumn(name = "tipoprodut", referencedColumnName = "elementabela") })
    private TbItemTabelaGenerica tipo = new TbItemTabelaGenerica();

    @ManyToOne
    @JoinColumn(name = "grupo", referencedColumnName = "grupo")
    private TbGrupo grupo = new TbGrupo();

    @ManyToOne
    @JoinColumn(name = "subgrupo", referencedColumnName = "subgrupo")
    private TbSubGrupo subgrupo = new TbSubGrupo();

    @Column(name = "descriprodut")
    @NotNull
    private String descricao;

    @Column(name = "referecomerc", length = 10)
    private String referenciaComercial;

    @Column(name = "codigobarra", length = 20)
    private String codigoBarra;

    @Column(name = "descricomerc", length = 40)
    private String descricaoComercial;

    @Column(name = "fatorunidad")
    private Integer fatorUnidade;

    @Column(name = "classifiscal")
    private Integer classificacaoFiscal;

    @Column(name = "pesoliquid", columnDefinition = "valorsimple")
    private Double pesoLiquido;

    @Column(name = "pesobruto", columnDefinition = "valorsimple")
    private Double pesoBruto;

    @Column(name = "dimensromane")
    private Short dimensaoRomaneiro;

    @Column(name = "aplicabasica", length = 200)
    private String aplicacaoBasica;

    @Column(name = "datacadast", columnDefinition = "datahora")
    @Temporal(TemporalType.TIMESTAMP)
    private Date dataCadastro;

    @Column(name = "cancel")
    private Boolean cancelado;

    @Column(name = "precoreposi", columnDefinition = "valorsimple")
    private Double precoreposicao;

    @Column(name = "ancoravalor", columnDefinition = "valorsimple")
    private Double ancoraValor;

    @Column(name = "ancoradata", columnDefinition = "data")
    @Temporal(TemporalType.DATE)
    private Date ancoraData;

    @Column(name = "markuppadrao", columnDefinition = "percen")
    private Double markupPadrao;

    @Column(name = "precovenda", columnDefinition = "valorsimple")
    private Double precoVenda;

    @Column(name = "dataultimoajuste", columnDefinition = "data")
    @Temporal(TemporalType.DATE)
    private Date dataUltimoAjuste;

    @Column(name = "desconmaximo", columnDefinition = "percen")
    private Double descontoMaximo;

    @Column(name = "fatorembala", columnDefinition = "valorsimple")
    private Double fatorEmbalagem;

    @Transient
    private Double precoVendaTransient;

}

@Getter
@Setter
public class ParametroBuscaProduto implements Serializable{

    /**
     * 
     */
    private static final long serialVersionUID = -1106207499068275244L;

    private String grupo;

    private String subGrupo;

    private Integer marca;

    private String descricao;

    private String referencia;

    private String aplicacao;

    private String sessao;

}

Versões(3):

Ver a versão formatada

Pagiancao usando distinct do criteria

Comentário

new question