java - 使用条件在休眠中多次加入
问题描述
我想用休眠加入 4 个表。我编写以下代码用于按学生 ID 获取课程名称、课程教师详细信息和课程时间表:我的学生实体是:
@Entity
@Table(name = "students", schema = "public")
public class Student {
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "students_id_seq")
@SequenceGenerator(name = "students_id_seq", sequenceName = "students_id_seq", allocationSize = 1)
@Column(name = "id", nullable = false, unique = true)
private int id;
@Column(name = "name", nullable = false, length = 60)
private String name;
@Column(name = "code_melli", nullable = false, length = 10)
private String codeMelli;
@Column(name = "register_date", nullable = false)
private Date registerDate;
@Column(name = "mobile", length = 11)
private String mobile;
@Column(name = "phone", length = 15)
private String phone;
@Column(name = "email", length = 50)
private String email;
@JsonIgnore
@OneToMany(fetch = FetchType.LAZY)
@JoinColumn(name = "student_id", referencedColumnName = "id", insertable = false, updatable = false)
private List<Attend> attends;
我的出席实体决定学生在课程中的出勤率和他的分数是:
@Entity
@Table(name = "attend", schema = "public")
public class Attend {
@EmbeddedId
AttendKey attendKey;
@Column(name = "score")
private int score;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "student_id", referencedColumnName = "id", insertable = false, updatable = false)
private Student student;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "course_id", referencedColumnName = "id", insertable = false, updatable = false)
private Course course;
映射课程详细信息的课程实体是:
@Entity
@Table(name = "courses", schema = "public")
public class Course {
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "courses_id_seq")
@SequenceGenerator(name = "courses_id_seq", sequenceName = "courses_id_seq", allocationSize = 1)
@Column(name = "id", nullable = false, unique = true)
private int id;
@Column(name = "code")
private int code;
@Enumerated(EnumType.ORDINAL)
@Column(name = "cluster", nullable = false)
private ClusterType cluster;
@Column(name = "name", nullable = false, length = 40)
private String name;
@OneToOne
@JoinColumn(name = "teacher_id")
private Teacher teacher;
@Column(name = "students", nullable = false)
private int students;
@Column(name = "salary", nullable = false)
private int salary;
@Column(name = "tuition", nullable = false)
private int tuition;
@Column(name = "start_date")
private Date startDate;
@Column(name = "end_date")
private Date endDate;
@JsonIgnore
@OneToMany(fetch = FetchType.LAZY)
@JoinColumn(name = "course_id", referencedColumnName = "id", insertable = false, updatable = false)
private List<Schedule> scheduleList;
并且在一周中的某一天保存课程的开始和结束时间的计划实体是:
@Entity
@Table(name = "schedule", schema = "public")
@IdClass(ScheduleKey.class)
public class Schedule {
@Id
@Column(name = "course_id")
private int course_id;
@Id
@Column(name = "day")
@Enumerated(EnumType.ORDINAL)
private Day day;
@Column(name = "start", nullable = false)
private Time start;
@Column(name = "endt", nullable = false)
private Time endt;
我如何使用休眠标准 API 加入这些表并获取特定学生的课程表。
获取数据的 SQL 查询:
select
*
from
students
inner join
attend
on students.id=attend.student_id
inner join
courses
on attend.course_id=course.id
left outer join
schedule_
on course.id=schedule.course_id
left outer join
public.teachers
on course.teacher_id=teacher.id
where
students.id=102552
我用
public Student getStudentDetail(int studentId) {
Criteria criteria = createEntityCriteria();
criteria.add(Restrictions.eq("id", studentId));
criteria.setFetchMode("attends", FetchMode.JOIN);
Criteria attendCriteria = criteria.createCriteria("attends", "attend")
.setFetchMode("course", FetchMode.JOIN);
Criteria courseCriteria = attendCriteria.createCriteria("course", "course")
.setFetchMode("scheduleList", FetchMode.JOIN);
Criteria scheduleCriteria = courseCriteria.createCriteria("scheduleList", "schedule");
return (Student) scheduleCriteria.uniqueResult();
}
解决方案
推荐阅读
- python - 从 Python 与 Node.js 进程通信
- php - php `require()` 一个包含另一个 `require()` 的文件
- python - 在 Heroku 上将自然语言工具包与 Django 结合使用 - - 错误:找不到“nltk.txt”
- r - list.files:正则表达式模式在 Windows 上不起作用?
- migration - 在现有物理主机上无法增加虚拟机容量时,配置虚拟机到另一台物理主机的实时迁移策略
- c++ - 计算复合类的哈希值
- swift - 在使用 Swift 而没有第三方框架的情况下查看生产中抛出的错误的好方法是什么?
- c++ - 正确使用函数的显式模板实例化?
- laravel - 使用 3 个表在 laravel eloquent 中创建计算的自定义列
- c# - T4 TemplateFileManager 输出到项目文件夹