FetchType.EAGER: pagination with repeated data

0

I'm developing a Java system and came across a problem. There is a page called Calendar Triad that there is a list of enums, since the user could choose more than one answer option in which I will show the type of relationship I made so I could save in the database. My question was that when I saved this array to the database I used the @ElementCollection (fetch = FetchType.EAGER). In this when doing the research it showed goes times the same data, but can partially solve with the criteria.setResultTransformer (Criteria.DISTINCT_ROOT_ENTITY). But here comes my difficulty ... I am using a page to show few data per page, making depending on the amount of enums I have saved in this calendar appear only this data on the first page and the rest of the query on the following pages. Being that the right one would be 5 dice. I would like to know what I can do to resolve this. Note: using LEARN in the above annotation would not solve for this case in my in the application.

Class ScheduleTriados

@Entity @Table (name="agenda_triados") public class ScheduleTriados 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<IndicacaoProcedimento> 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;
}

 @ElementCollection(fetch = FetchType.EAGER)
 @JoinTable(name = "indicacao_procedimento", joinColumns = @JoinColumn(name
 = "id_agenda_triados"))
 @Column(name = "indicacao", nullable = false)
 @Enumerated(EnumType.STRING)
 public List<IndicacaoProcedimento> getIndicacoes() {
 return indicacoes;
 }

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



@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;
}

@OneToMany(mappedBy = "agenda_triados", cascade = CascadeType.ALL)
public List<AtendimentoTriados> getAtendimentos_triados() {
    return atendimentos_triados;
}

public void setAtendimentos_triados(List<AtendimentoTriados> atendimentos_triados) {
    this.atendimentos_triados = atendimentos_triados;
}


@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);

}

}

The Enum

public enum IndicationProcedure {

CIRURGIA("Cirurgia"),
DENTISTICA("Dentística"),
ENDODONTIA("Endodontia"),
ODONTOPEDIATRIA("Odontopediatria"),
PACIENTES_ESPECIAIS("Pacientes Especiais"),
PERIODONTIA("Periodontia"),
PROTESE_FIXA("Prótese Fixa"),
PROTESE_TOTAL("Prótese Total");

private String descricao;

IndicacaoProcedimento(String descricao) {
    this.descricao = descricao;
}

public String getDescricao() {
    return descricao;
}

}

The repository

public class Triates 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.");
    }
}
@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");

    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("tr.indicacoes", filtro.getIndicacoes()));

    }

    return criteria;
}

}

The Filter

public class ScheduleTriadosFilter implements Serializable {

private static final long serialVersionUID = 1L;

private Date dataAtenderDe;
private Date dataAtenderAte;
private String nomeDisc;
private IndicacaoProcedimento[] indicacoes;
private String nomeAl;
private String nomePaciente;
private String codigo;
private Turno[] turnos;
private Pratica[] praticas;
private int primeiroRegistro;
private int quantidadeRegistros;

// getts and setts

    
asked by anonymous 12.02.2018 / 21:17

0 answers