Paging with criteria.distinct_root_entity

0

I'm developing Java web application and came across a problem. I have a n: n relationship between DateTime and DateTime and it is returning duplicate data when I make a query ... I can return the situation using criteria.setResultTransformer (Criteria.DISTINCT_ROOT_ENTITY), but when I put pagination the amount per page of data ends up getting wrong , that is, it does not perform the correct pagination ... in one page it is bigger than the other. for example, if it is 5 per page depending on the amount of indication procedure saved in a schedule will only be a given shows on the page. If I was not clear enough then put the question that I explained.

Class ScheduleTriados

@Entity
@Table(name = "agenda_triados")
public class AgendaTriados implements Serializable {

    private static final long serialVersionUID = 1L;

    private Long id;
    private String observacao;
    private Date dataAtendimento;
    private Aluno aluno;
    private Aluno aluno2;
    private Disciplina disciplina;
    private AgendaMarcacao agenda_marcacao;
    private List<Indicacao> indicacoes = new ArrayList<>();

    @Id
    @GeneratedValue
    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    @Column(columnDefinition = "text")
    public String getObservacao() {
        return observacao;
    }

    public void setObservacao(String observacao) {
        this.observacao = observacao;
    }

    @NotNull
    @Column(name = "data_atendimento")
    @Temporal(TemporalType.DATE)
    public Date getDataAtendimento() {
        return dataAtendimento;
    }

    public void setDataAtendimento(Date dataAtendimento) {
        this.dataAtendimento = dataAtendimento;
    }

    @NotNull
    @ManyToOne
    @JoinColumn(name = "id_aluno")
    public Aluno getAluno() {
        return aluno;
    }

    public void setAluno(Aluno aluno) {
        this.aluno = aluno;
    }

    @NotNull
    @ManyToOne
    @JoinColumn(name = "id_aluno2")
    public Aluno getAluno2() {
        return aluno2;
    }

    public void setAluno2(Aluno aluno2) {
        this.aluno2 = aluno2;
    }

    @NotNull
    @ManyToOne
    @JoinColumn(name = "id_disciplina")
    public Disciplina getDisciplina() {
        return disciplina;
    }

    public void setDisciplina(Disciplina disciplina) {
        this.disciplina = disciplina;
    }


    @NotNull
    @ManyToOne(cascade = { CascadeType.PERSIST, CascadeType.MERGE })
    @JoinColumn(name = "id_agenda_marcacao")
    public AgendaMarcacao getAgenda_marcacao() {
        return agenda_marcacao;
    }

    public void setAgenda_marcacao(AgendaMarcacao agenda_marcacao) {
        this.agenda_marcacao = agenda_marcacao;
    }

    @NotNull
    @ManyToMany
    @JoinTable(name = "triado_indicacao", joinColumns = @JoinColumn(name = "agenda_triados_id"),
        inverseJoinColumns = @JoinColumn(name = "indicacao_id"))
    public List<Indicacao> getIndicacoes() {
        return indicacoes;
    }

    public void setIndicacoes(List<Indicacao> indicacoes) {
        this.indicacoes = indicacoes;
    }

    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + ((id == null) ? 0 : id.hashCode());
        return result;
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        AgendaTriados other = (AgendaTriados) obj;
        if (id == null) {
            if (other.id != null)
                return false;
        } else if (!id.equals(other.id))
            return false;
        return true;
    }

    public void completarCampo() {
        Disciplina disciplina = new Disciplina();
        AgendaTriados triado = new AgendaTriados();

        triado.setDisciplina(disciplina);

    }

}

Class Indication

@Entity
@Table(name = "indicacao")
public class Indicacao implements Serializable {

    private static final long serialVersionUID = 1L;

    private Long id;
    private String nome;

    @Id
    @GeneratedValue
    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    @Column(nullable = false)
    public String getNome() {
        return nome;
    }

    public void setNome(String nome) {
        this.nome = nome;
    }

    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + ((id == null) ? 0 : id.hashCode());
        return result;
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        Indicacao other = (Indicacao) obj;
        if (id == null) {
            if (other.id != null)
                return false;
        } else if (!id.equals(other.id))
            return false;
        return true;
    }

    @Override
    public String toString() {
        return nome;
    }
}

Repository Triates

public class Triados implements Serializable {

    private static final long serialVersionUID = 1L;

    @Inject
    private EntityManager manager;

    public AgendaTriados guardar(AgendaTriados triado) {

        return manager.merge(triado);

    }

    @Transactional
    public void remover(AgendaTriados triado) {
        try {
            triado = porId(triado.getId());
            manager.remove(triado);
            manager.flush();
        } catch (PersistenceException e) {
            throw new NegocioException("A agenda não pode ser excluída.");
        }
    }

    public AgendaTriados porId(Long id) {
        return manager.find(AgendaTriados.class, id);
    }


    @SuppressWarnings("unchecked")
    public List<AgendaTriados> filtrados(AgendaTriadosFilter filtro) {
        Criteria criteria = criarCriteriaParaFiltro(filtro);

        criteria.setFirstResult(filtro.getPrimeiroRegistro());
        criteria.setMaxResults(filtro.getQuantidadeRegistros());

        return criteria.addOrder(Order.asc("dataAtendimento")).list();
    }

    public int quantidadeFiltrados(AgendaTriadosFilter filtro) {
        Criteria criteria = criarCriteriaParaFiltro(filtro);

        criteria.setProjection(Projections.rowCount());
        return ((Number) criteria.uniqueResult()).intValue();
    }

    private Criteria criarCriteriaParaFiltro(AgendaTriadosFilter filtro) {
        Session session = this.manager.unwrap(Session.class);

        Criteria criteria = session.createCriteria(AgendaTriados.class, "tr");
        // criteria.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);
        criteria.createAlias("tr.agenda_marcacao", "trag");
        criteria.createAlias("trag.lista_espera", "agenda");
        criteria.createAlias("agenda.paciente", "triado");
        criteria.createAlias("tr.disciplina", "trd");
        criteria.createAlias("tr.aluno", "tral");
        criteria.createAlias("indicacoes", "indi");


        if (filtro.getDataAtenderDe() != null) {
            criteria.add(Restrictions.ge("tr.dataAtendimento", filtro.getDataAtenderDe()));
        }

        if (filtro.getDataAtenderAte() != null) {
            criteria.add(Restrictions.le("tr.dataAtendimento", filtro.getDataAtenderAte()));
        }

        if (StringUtils.isNotBlank(filtro.getNomeDisc())) {

            criteria.add(Restrictions.ilike("trd.nome", filtro.getNomeDisc(), MatchMode.ANYWHERE));
        }

        if (StringUtils.isNotBlank(filtro.getCodigo())) {
            criteria.add(Restrictions.ilike("trd.codigo", filtro.getCodigo(), MatchMode.EXACT));
        }

        if (filtro.getPraticas() != null && filtro.getPraticas().length > 0) {
            criteria.add(Restrictions.in("trd.pratica", filtro.getPraticas()));

        }
        if (filtro.getTurnos() != null && filtro.getTurnos().length > 0) {
            criteria.add(Restrictions.in("trd.turno", filtro.getTurnos()));

        }

        if (StringUtils.isNotBlank(filtro.getNomeAl())) {

            criteria.add(Restrictions.ilike("tral.nomeAluno", filtro.getNomeAl(), MatchMode.ANYWHERE));
        }
        if (StringUtils.isNotBlank(filtro.getNomePaciente())) {

            criteria.add(Restrictions.ilike("triado.nome", filtro.getNomePaciente(), MatchMode.ANYWHERE));
        }

        if (filtro.getIndicacoes() != null && filtro.getIndicacoes().length > 0) {
            criteria.add(Restrictions.in("indi.nome", filtro.getIndicacoes()));
        }

        return criteria;
    }

}

I searched for criteria.setProjection (Projections.distinct (Projections.id ())), but I'm not getting it to work ....

    
asked by anonymous 15.03.2018 / 20:35

0 answers