如何在Grails中将两个查询结果合并到一张地图中?

时间:2011-12-19 15:41:02

标签: grails groovy grails-controller

我是Grails开发的新手。

我有这样的域类:

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

我已经用一些测试数据进行了自举。现在我想进行查询,条件如下:

  • 我需要选择属于特定task的每个bootstrap.groovy(存储在Todaysdate中)。

例如,如果我在BootStrap.groovy

中有这些陈述
//other codes
def daySchedule3 = new DaySchedule(Todaysdate:new Date(),
                startTime:"6pm",endTime:"10pm",
                task:"ReaD git...",completed:false)
def daySchedule4 = new DaySchedule(Todaysdate:new Date()+1,
                startTime:"10am",endTime:"12pm",
                task:"Read MySQL....",completed:false)

现在很明显taskReaD git...属于一天(今天我已经new Date()进入了它)。

为了找到这些,我想出了一个像这样的部分解决方案:

        def allTasks = DaySchedule.findAllByTaskIsNotNull()
        def dates  = allTasks.collect { it.Todaysdate }
        def tasks = dates.collect { 
                    def queryParameter = new DaySchedule(Todaysdate:it)
                    def todaysWork = DaySchedule.findAll(queryParameter)
                    todaysWork.task 
        }

我的代码有问题。我无法在collectEntriesdates上使用tasks方法,因此我将其转换为特定日期的地图(即dates),其值为tasks }。 (这是我试过的!)

现在我离开了。我无法找到猜测dates所属tasks的方法。

还有其他解决方案吗?

提前致谢。

2 个答案:

答案 0 :(得分:1)

听起来您正在尝试使用所有域对象DaySchedule的日期键和任务名称值来获取地图。您可以尝试Collection.groupBy。例如:

def allTasks = DaySchedule.findAllByTaskIsNotNull()

def tasksByDate = [:] // start with empty map

tasksByDate.putAll(
    allTasks.groupBy { task ->
        // group by just the date portion, ignoring time
        // clone since clearTime modifies original
        task.todaysDate.clone().clearTime()
    }.collect { date, daySchedule ->
        // change from map of date -> daySchedule to map of date -> task
        [date, daySchedule.task] as MapEntry
    }
)

答案 1 :(得分:1)

我认为你在某个地方遇到了设计问题......这样会更容易:

class Task {
    Date startTime;  
    Date endTime;
    String description
    int priority 
    boolean completed
    static belongsTo = [ schedule : Schedule ]

    String toString() {
        return "${description} : from ${startTime} to ${endTime}"
    }

}

然后,您可以列出您在其中拥有任务的所有日期,如下所示:

java.text.DateFormat df = java.text.DateFormat.getDateInstance(DateFormat.LONG, Locale.US);

def days = Task.list().collect {
      df.format(it.startTime);
}.unique()

现在,“days”变量包含数据库中存在的具有相关任务的唯一日期字符串数组。

如果您想按日列出任务,则可以执行以下操作:

days.each { dayString ->
    def date = df.parse(dayString)
    def dayTasks = Task.findAllByStartTimeBetween(date, date+1)
    println "Tasks for ${dayString}"
    dayTasks.each {
        println "    - ${it}"
    }
}