【问题标题】:How Do I Combine Two Query Results In To A Map, In Grails?如何在 Grails 中将两个查询结果合并到一个地图中?
【发布时间】:2011-12-19 15:41:01
【问题描述】:

我是 Grails 开发的新手。

我有一个这样的域类:

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

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

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

例如,如果我的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 
        }

我对这段代码有疑问。我无法在datestasks 上使用collectEntries 方法,因此我将其转换为特定日期的地图(即dates),其值为tasks。 (这是我尝试的!)

现在我一个人呆着。我无法找到一种方法来猜测dates tasks 属于哪个。

还有其他解决方案吗?

提前致谢。

【问题讨论】:

    标签: grails groovy grails-controller


    【解决方案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
        }
    )
    

    【讨论】:

    • groupBy 方法返回 null 作为键值。不是todaysDate...
    • findAllByTaskIsNotNull 返回的日期是否为空?另外,请确保您的大小写正确;你的代码中有Todaysdate,但我使用了更传统的todaysDate
    • 是的,我已经正确更改了Todaysdate。从findAllByTaskIsNotNull 开始,所有日期都将正常返回。我猜问题出在clone().clearTime()这行代码...
    【解决方案2】:

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

    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}"
        }
    }
    

    【讨论】:

    • 你说的是对的。我的主要目标是每天渲染所有任务。现在问题变成了,我将如何将findAllByStartTimeBetween(date1, date2) 用于我表中所有可能的todaysDate?这就是为什么我没有使用它们.....
    • 你可以使用 grails 2.0 吗?使用新的 where 查询语法和日期函数的用法会更容易:请参阅 grails.org/doc/2.0.0/guide/GORM.html#whereQueries 并向下滚动到“其他函数”一章...
    • 是的,很快就会迁移....我想正如@ataylor 所说,groupBy 方法可以很好地完成这项工作(在我的情况下)并且易于维护.. 无论如何谢谢为您解答...
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-07-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多