使用GORM的动态FindAllBy方法时出现Sql错误 - 未设置#2

时间:2014-10-29 02:54:27

标签: sql grails gorm

我有这些域类:

class Person{
    String username
}

class Course {
    String code
    static hasMany = [events:Event]
}

class Event {
    Long id
    String name
    (...)

    static belongsTo = [course:Course, parallel:Parallel]
    static hasMany = [teachers: Person, students: Person,bought: Exchange, sold: Exchange]
}

我想要做的是找到与学生课程相关的所有活动。我做了这个查询:

(...)
    println "User: ${person.username}"
    println "Course: ${course.code}"


    Set<Person> persons = []
    persons.add(person)

    def events = Event.findAllByCourseAndStudents(course, persons)
}

但是这给了我一个错误ERROR util.JDBCExceptionReporter - Parameter "#2" is not set; SQL statement:

我在这里缺少什么?

1 个答案:

答案 0 :(得分:1)

查询Students中第二个参数的问题在于它是1:M(一对多)关联,并且不支持使用动态查找器查询这些关联。

查看GORM / Grails支持的各种类型查询的this quick overview,以便更好地了解您可以使用哪种选项以及何时使用它们。

正如您所看到的,使用criteria确实是您在这种情况下所需要的:

def events = Event.createCriteria().list() {
  eq('course', course)
  students {
      eqId(person.id)
    }
  }
}

以上内容仅与单个人匹配,但您可以进一步修改此选项以使用您想要的人员列表。我将把这个练习留给你,这样你就可以熟悉如何创建和使用标准。