#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 /. …