2
I have two entities Scheduler and Intervalodehoras. These two entities have other relationships that when I do a search with Rest, comes a lot of data unnecessary. To avoid this I created two DTO tables being, Agendadooperadordto and Intervalodehorasdto, with the aim of setting up a reduced consultation. I am using the Criteria. I was able to make the query using only Agendadooperadordto. But I am unable to use returning the list of Intervalodehorasdto.
I’ll show you what I’ve done.
Scheduler
@Entity
@Table(name="agenda_do_operador")
public class AgendaDoOperador implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@NotNull
@ManyToOne(fetch=FetchType.LAZY)
@JoinColumn(name = "operador_id", nullable = false)
private Usuario operador;
@Column(name="data_agenda",columnDefinition="Date")
@NotNull(message="data da agenda não pode ser nula")
private LocalDate data;
@OneToMany(mappedBy = "agendaDoOperador", cascade = CascadeType.ALL, orphanRemoval = true, fetch = FetchType.LAZY)
private List<IntervaloDeHoras> intervaloDeHoras;
// Get and Sets
}
Intervalodehoras
@Entity
@Table(name="intervalo_de_horas")
public class IntervaloDeHoras implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@ManyToOne
@JoinColumn(name = "agenda_id", nullable = true)
private AgendaDoOperador agendaDoOperador;
@Column(name="hora_inicial", columnDefinition="time")
@NotNull(message="HoraHHmm Inicial não pode ser nula")
private LocalTime horaInicial;
@Column(name="hora_final", columnDefinition="time")
@NotNull(message="HoraHHmm Final não pode ser nula")
private LocalTime horaFinal;
@ManyToOne
@JoinColumn(name = "usuario_id", nullable = true)
private Usuario usuario;
@Enumerated(EnumType.STRING)
@Column(name="status_da_agenda")
private StatusDaAgenda statusDaAgenda;
@Column(name="data_da_agenda",columnDefinition="Date")
private LocalDate dataDoAgendamento;
// gets and sets
}
Agendadooperadordto
public class AgendaDoOperadorDto {
private Long id;
private Long operadorId;
private String operadorNome;
private LocalDate data;
private List<IntervaloDeHorasDto> intervaloDeHoras;
// Contrutor para ser utilizado sem o intervalo de horas
// Este esta funcionando
public AgendaDoOperadorDto(Long id, Long operadorId, String operadorNome, LocalDate data) {
super();
this.id = id;
this.operadorId = operadorId;
this.operadorNome = operadorNome;
this.data = data;
}
// Contrutor para ser utilizado com o intervalo de horas
// Este é o que não estou conseguindo
public AgendaDoOperadorDto(Long id, Long operadorId, String operadorNome, LocalDate data,List<IntervaloDeHorasDto> intervaloDeHoras) {
super();
this.id = id;
this.operadorId = operadorId;
this.operadorNome = operadorNome;
this.data = data;
this.intervaloDeHoras = intervaloDeHoras;
}
// gets
}
Intervalodehorasdto
public class IntervaloDeHorasDto {
private Long id;
private LocalTime horaInicial;
private LocalTime horaFinal;
private String nomeUsarioAgendado;
public IntervaloDeHorasDto(Long id, LocalTime horaInicial, LocalTime horaFinal, String nomeUsarioAgendado) {
super();
this.id = id;
this.horaInicial = horaInicial;
this.horaFinal = horaFinal;
this.nomeUsarioAgendado = nomeUsarioAgendado;
}
// gets
}
Below the Criteria that is working
@Override
public Page<AgendaDoOperadorDto> filtrar(AgendaDoOperadorFilter agendaDoOperadorFilter, Pageable pageable) {
CriteriaBuilder builder = manager.getCriteriaBuilder();
CriteriaQuery<AgendaDoOperadorDto> criteria = builder.createQuery(AgendaDoOperadorDto.class);
Root<AgendaDoOperador> root = criteria.from(AgendaDoOperador.class);
criteria.select(builder.construct(AgendaDoOperadorDto.class,
root.get("id"),
root.get("operador").get("id"),
root.get("operador").get("nome"),
root.get("data") ));
Predicate[] predicates = filtrarCriarRestricoes(agendaDoOperadorFilter,builder,root);
criteria.where(predicates);
TypedQuery<AgendaDoOperadorDto> query = manager.createQuery(criteria);
publisher.publishEvent(new CriarPaginacaoEvent(this, query, pageable));
//PaginacaoApi.adicionarRestricoesDePaginacao(query, pageable);
return new PageImpl<>(query.getResultList(),pageable,PaginacaoApi.filtrarTotal(manager, predicates, AgendaDoOperador.class));
}
The Problem
The problem is that I don’t know how to include the list of List ranges in this query.
Thank you if anyone has any example they can use in this situation.
But how do I transform the Intervalodehoras in the Intervalodehorasdto to be assigned in the Agendadooperadordto?
– Marcelo