在这种情况下,findAllBy *如何工作?

时间:2011-12-17 06:00:19

标签: grails groovy

我有两个域类:

DaySchedule

class DaySchedule {
    Date Todaysdate
    String startTime;
    String endTime;
    String task
    int priority 
    boolean completed
    static belongsTo = [ schedule : Schedule ]
}

定时

class Schedule {
    Date date;
    static belongsTo = [ user : User ]
    static hasMany = [ daySchedules : DaySchedule ]
        static constraints = {
        date(blank:false)
        }
        String toString() {
              "Belongs to schedule"
    }
}

现在,当我使用DaySchedulefindAllByTaskIsNotNull()课程上进行查询时,我希望它会返回task上的所有DaySchedule,但我得到"Belongs to schedule" }作为我的查询结果。喜欢这个

def allTasks = DaySchedule.findAllByTaskIsNotNull()
//returns "Belongs to schedule"

如果我更进一步,并查询allTasks我按预期获得所有task。像这样:

def expected = allTasks.task
println expected //prints all tasks!

我无法理解findAllByTaskIsNotNull()的行为。所以我的实际问题是findAllByTaskIsNotNull()应该返回所有task,对吗?为什么找到合适的Schedule?这是怎么回事?我错误地理解了这个概念吗?

提前致谢。

2 个答案:

答案 0 :(得分:2)

我认为你确实错误地理解了这个概念。 动态查找程序检索正在调用它们的类的对象或对象列表。

因此,在您的示例中,DaySchedule.findAllByTaskIsNotNull()将检索“DaySchedule”类型的对象。

“task”只是DaySchedule类的String属性,并且您在Schedule类中定义了一个toString方法,该方法返回“属于计划”...这样当您在结果上调用println时会打印出来的内容该类实际上属于DaySchedule,而DaySchedule类上没有toString方法。

因此,如果您希望显示任务属性,请将其添加到DaySchedule类中:

String toString() {
     return this.task
}

答案 1 :(得分:1)

你的代码有缺陷,因为toString方法是INSIDE static contraints闭包,所以我不会对你在toString调用中产生一些副作用感到惊讶。尝试修复将toString置于闭包之外的代码并让我知道

此外,只需查看方法名称:findAll - >通过< --- TaskIsNotNull,这意味着它将找到没有空任务的DyaSchedule,所以答案是可以的。