我是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)
现在很明显task
,ReaD 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
}
我的代码有问题。我无法在collectEntries
和dates
上使用tasks
方法,因此我将其转换为特定日期的地图(即dates
),其值为tasks
}。 (这是我试过的!)
现在我离开了。我无法找到猜测dates
所属tasks
的方法。
还有其他解决方案吗?
提前致谢。
答案 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}"
}
}