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