CourseDao

class CourseDao(id: EntityID<UUID>) : Entity<UUID>(id) {
    companion object : EntityClass<UUID, CourseDao>(CourseTable)

    var name by CourseTable.name
    val grades by GradeDao referrersOn GradeTable.course

    override fun toString() =
        "Курс $name"

    fun fullString() =
        toString() + "\t" + grades.joinToString { it.toString() }
}

GradeDao

class GradeDao(id: EntityID<UUID>) : Entity<UUID>(id) {
    companion object : EntityClass<UUID, GradeDao>(GradeTable)

    var student by StudentDao referencedOn GradeTable.student
    var course by CourseDao referencedOn GradeTable.course
    var value by GradeTable.value
    val date by GradeTable.date

    override fun toString() = 
      "Студент $student - Курс $course - $value - $date"
}

Создаем курсы и студентов

val dbStudents = students.map { student ->
  StudentDao.new(UUID.randomUUID()) {
    name = student.name
    group = student.group
  }
}
val dbCourses = courses.map { course ->
  CourseDao.new(UUID.randomUUID()) {
    name = course.name
  }
}

Добавление оценок

val dbGrades = dbCourses.map { courseDao ->
  .map { studentDao ->
    GradeDao.new(UUID.randomUUID()) {
      student = studentDao
      course = courseDao
    }
  }
}

Изменение оценок

val pennyId = dbStudents.find { it.name == "Penny" }?.id!!
val mathId = dbCourses.find { it.name == "Math" }?.id!!
val pennyGradeId = dbGrades.find { 
  it.course.id == mathId && it.student.id==pennyId }?.id!!
val pennyGrade = GradeDao.find{
  GradeTable.id eq pennyGradeId
}.first()

pennyGrade.value = 5

Обычная загрузка

println("\n\nNO EAGER LOAD\n\n")
CourseDao.all().map { it.fullString() }

NO EAGER LOAD
SELECT COURSES.ID, COURSES."NAME" FROM COURSES
SELECT GRADES.ID, GRADES."VALUE", GRADES."DATE", GRADES.COURSE, GRADES.STUDENTS FROM GRADES WHERE GRADES.COURSE = '...'
SELECT STUDENTS.ID, STUDENTS."NAME", STUDENTS."GROUP" FROM STUDENTS WHERE STUDENTS.ID = '...'
SELECT STUDENTS.ID, STUDENTS."NAME", STUDENTS."GROUP" FROM STUDENTS WHERE STUDENTS.ID = '...'
SELECT STUDENTS.ID, STUDENTS."NAME", STUDENTS."GROUP" FROM STUDENTS WHERE STUDENTS.ID = '...'
SELECT STUDENTS.ID, STUDENTS."NAME", STUDENTS."GROUP" FROM STUDENTS WHERE STUDENTS.ID = '...'
SELECT STUDENTS.ID, STUDENTS."NAME", STUDENTS."GROUP" FROM STUDENTS WHERE STUDENTS.ID = '...'
SELECT STUDENTS.ID, STUDENTS."NAME", STUDENTS."GROUP" FROM STUDENTS WHERE STUDENTS.ID = '...'
SELECT GRADES.ID, GRADES."VALUE", GRADES."DATE", GRADES.COURSE, GRADES.STUDENTS FROM GRADES WHERE GRADES.COURSE = '...'
SELECT GRADES.ID, GRADES."VALUE", GRADES."DATE", GRADES.COURSE, GRADES.STUDENTS FROM GRADES WHERE GRADES.COURSE = '...'

Жадная загрузка

println("\n\nEAGER LOAD\n\n")
CourseDao.all().with(CourseDao::grades).map { it.fullString() }

EAGER LOAD
SELECT COURSES.ID, COURSES."NAME" FROM COURSES
SELECT GRADES.ID, GRADES."VALUE", GRADES."DATE", GRADES.COURSE, GRADES.STUDENTS FROM GRADES 
  WHERE GRADES.COURSE IN ('...', '...', '...')
SELECT COURSES.ID, COURSES."NAME" FROM COURSES
SELECT STUDENTS.ID, STUDENTS."NAME", STUDENTS."GROUP" FROM STUDENTS WHERE STUDENTS.ID = '...'
SELECT STUDENTS.ID, STUDENTS."NAME", STUDENTS."GROUP" FROM STUDENTS WHERE STUDENTS.ID = '...'
SELECT STUDENTS.ID, STUDENTS."NAME", STUDENTS."GROUP" FROM STUDENTS WHERE STUDENTS.ID = '...'
SELECT STUDENTS.ID, STUDENTS."NAME", STUDENTS."GROUP" FROM STUDENTS WHERE STUDENTS.ID = '...'
SELECT STUDENTS.ID, STUDENTS."NAME", STUDENTS."GROUP" FROM STUDENTS WHERE STUDENTS.ID = '...'
SELECT STUDENTS.ID, STUDENTS."NAME", STUDENTS."GROUP" FROM STUDENTS WHERE STUDENTS.ID = '...'

Очень жадная загрузка

println("\n\nVERY EAGER LOAD\n\n")
CourseDao.all()
  .with(CourseDao::grades, GradeDao::student)
  .map { it.fullString() }

VERY EAGER LOAD
SELECT COURSES.ID, COURSES."NAME" FROM COURSES
SELECT GRADES.ID, GRADES."VALUE", GRADES."DATE", GRADES.COURSE, GRADES.STUDENTS FROM GRADES 
  WHERE GRADES.COURSE IN ('...', '...', '...')
SELECT STUDENTS.ID, STUDENTS."NAME", STUDENTS."GROUP" FROM STUDENTS 
  WHERE STUDENTS.ID IN ('...', '...', '...', '...', '...', '...')
SELECT COURSES.ID, COURSES."NAME" FROM COURSES