How to replace CriteriaBuilder with Spring JPA

Viewed 115

I have next classes:

@Entity
@Table
public class Lesson implements ModelEntity {

    @Id
    @Column(name = "lesson_id")
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int id;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "course_id")
    private Course course;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "lesson_type_id")
    private LessonType lessonType;

    private LocalDate date;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "time_slot_id")
    private TimeSlot timeSlot;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "auditorium_id")
    private Auditorium auditorium;

    @ManyToMany(fetch = FetchType.LAZY)
    @JoinTable(name = "lesson_teacher", joinColumns = @JoinColumn(name = "lesson_id"), inverseJoinColumns = @JoinColumn(name = "person_id"))
    private Set<Teacher> teachers = new HashSet<>();;

    @ManyToMany(fetch = FetchType.LAZY)
    @JoinTable(name = "lesson_group", joinColumns = @JoinColumn(name = "lesson_id"), inverseJoinColumns = @JoinColumn(name = "group_id"))
    private Set<Group> groups = new HashSet<>();
}

@Entity
@Table(name = "groups")
public class Group implements ModelEntity {

    @Id
    @Column(name = "group_id")
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int id;
    
    @Column(name = "group_name")
    private String name;
    
    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "faculty_id")
    private Faculty faculty;
    
    @OneToMany(fetch = FetchType.LAZY, mappedBy = "group")
    private List<Student> students;
}

@Entity
@Table
public class TimeSlot implements ModelEntity {

    @Id
    @Column(name = "time_slot_id")
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int id;

    @Column(name = "time_slot_number")
    private Integer number;

    @Column(name = "time_slot_name")
    private String name;

    @Column(name = "time_slot_start")
    private LocalTime startTime;

    @Column(name = "time_slot_end")
    private LocalTime endTime;
}

I wrote method, that find all Groups_id by Date and TimeSlot_id not connected to Lesson with CriteriaBuilder API, it works perfect:

@Override
    public Set<Integer> getBusyGroupsId(int lessonId, LocalDate date, int timeSlotId) {
        logger.debug("getBusyGroupsId() with agruments {}, {}, {}.", lessonId, date, timeSlotId);
        CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();
        CriteriaQuery<Integer> query = criteriaBuilder.createQuery(Integer.class);
        Root<Lesson> root = query.from(Lesson.class);
        List<Predicate> predicates = new ArrayList<>();
        Join<Lesson, TimeSlot> timeSlotJoin = root.join("timeSlot", JoinType.LEFT);
        predicates.add(criteriaBuilder.equal(timeSlotJoin.get("id"), timeSlotId));
        predicates.add(criteriaBuilder.equal(root.get("date"), date));
        if (nonNull(lessonId)) {
            predicates.add(criteriaBuilder.notEqual(root.get("id"), lessonId));
        }
        query.where(predicates.toArray(new Predicate[] {}));
        SetJoin<Lesson, Group> joinGroup = root.joinSet("groups");
        query.multiselect(joinGroup.get("id"));
        TypedQuery<Integer> result = entityManager.createQuery(query);
        return result.getResultStream().collect(Collectors.toSet());
    }

But after that I think- what about JPA, can it be easier? I tried something like that, but it doesnt work:

public Set<Integer> findGroupIdByIdNotAndDateEqualsAndTimeSlotIdEquals(Integer lessonId, LocalDate date, Integer timeSlotId);

How to fix it?

Also I stacked with writing method with JPA that should find all Lesson by Group_id and Date(or startDate-endDate) and sort it: first by date, second- by TimeSlot_number.

Can it be written with JPA?

Thanks in advance.

Don't throw stones, I'm just getting to know Spring JPA.

0 Answers
Related