Как заменить CriteriaBuilder на Spring JPA

#java #spring #jpa

#java #spring #jpa

Вопрос:

У меня есть следующие классы:

 @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;
}
 

Я написал метод, который находит все Groups_id по дате и TimeSlot_id, не связанные с уроком с CriteriaBuilder API, он работает идеально:

 @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());
    }
 

Но после этого я думаю — а как насчет JPA, может быть, проще?
Я пробовал что-то подобное, но это не работает:

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

Как это исправить?

Также я использовал метод записи с помощью JPA, который должен находить все уроки по Group_id и дате (или StartDate-EndDate) и сортировать их: сначала по дате, второй — по TimeSlot_number.

Может ли это быть написано с помощью JPA?

Заранее спасибо.

Не бросайте камни, я только знакомлюсь с Spring JPA.

Комментарии:

1. petrikainulainen.net/programming/spring-framework/…

2. спасибо за ссылку, но я не нашел ответа..

3. никто не может помочь?

4. извините, я не знаю, похоже на сложный запрос. Может быть, найдите вывод запроса в JPA, и вы увидите примеры того, как выполнять объединения thorben-janssen.com /.