DTO with List using Jpacriteria

Asked

Viewed 155 times

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.

1 answer

0

I believe the list is missing

root.fetch("intervaloDeHoras",JoinType.LEFT);
  • But how do I transform the Intervalodehoras in the Intervalodehorasdto to be assigned in the Agendadooperadordto?

Browser other questions tagged

You are not signed in. Login or sign up in order to post.