1. java
  2. android
  3. c#
  4. .net
  5. javascript
  6. php
  7. jquery
  8. html
  9. sql

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;

}
  • Você já experimentou habilitar o log das queries sendo executadas e ver a cláusula SQL criada?

    fmachado   29 de ago de 2013
  • boa dica ! mas como isso poderia me ajudar ?

    hr.mateus01   29 de ago de 2013
  1. Você vai ver essas setas em qualquer página de pergunta. Com elas, você pode dizer se uma pergunta ou uma resposta foram relevantes ou não.
  2. Edite sua pergunta ou resposta caso queira alterar ou adicionar detalhes.
  3. Caso haja alguma dúvida sobre a pergunta, adicione um comentário. O espaço de respostas deve ser utilizado apenas para responder a pergunta.
  4. Se o autor da pergunta marcar uma resposta como solucionada, esta marca aparecerá.
  5. Clique aqui para mais detalhes sobre o funcionamento do GUJ!

1 resposta

Não é a resposta que estava procurando? Procure outras perguntas com as tags hibernate java sql ou faça a sua própria pergunta.