DTO with List using JpaCriteria

2

I have two entities OperatorDate and HourDate . These two entities have other relationships that when I search with rest, it comes very unnecessary. To avoid this, I have created two DTO tables, DotOperator and DoodOper , in order to set up a small query. For this I am using Criteria . I was able to query using DotOperatorDate . But I am not able to use returning the list of TimeDate .

I'll show you what I've done.

OperatorDate

@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

}

Hours Range

@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

}

DotOperator

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
}

TimeDate

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 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 do not know how to include the list of List ranges in this query.

Thank you if anyone has any examples that you can use in this situation.

    
asked by anonymous 16.10.2018 / 14:42

1 answer

0

I think the list is missing

root.fetch("intervaloDeHoras",JoinType.LEFT);
    
16.10.2018 / 16:42