2011-12-19 41 views
0

Grailsの新機能です。2つのクエリ結果をマップに結合するにはどうすればよいですか?

私はこのようなドメインクラスがあります。

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

私はいくつかのテストデータのブートストラップとしています。

  • 私は特定のTodaysdateに属している(bootstrap.groovyに格納されている)各taskを選択する必要があります。今、私は、以下の条件で、クエリを実行します。たとえば、

私は私の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 
     } 

:私はこのような部分的な解決策を思い付いたこれらを検索するに

datestaskscollectEntriesメソッドを使用することができず、tasksの値を持つ特定の日付(つまりdates)のマップに変換することができませんでした。 (これは私が試したものです!)

今私は孤独になりました。私はtasksに属するdatesを推測する方法を見つけることができませんでした。

その他の解決方法はありますか?

ありがとうございます。

答えて

1

すべてのドメインオブジェクトDayScheduleに対して、日付のキーとタスク名の値を持つマップを取得しようとしているようです。 Collection.groupByを試してみてください。例:あなたが仕事を持っているすべての日付を一覧表示することができ、その後

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

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

} 

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 
    } 
) 
+0

'groupBy'メソッドはキー値として' null'なのでを返しています。 'todaysDate'ではなく... –

+0

' findAllByTaskIsNotNull'から日付が戻ってくるのでしょうか?また、大文字の権利を得ていることを確認してください。あなたのコードに 'Todaysdate'がありますが、もっと一般的な' todaysDate'を使用しました。 – ataylor

+0

ya私は 'Todaysdate'を正しく変更しました。 'findAllByTaskIsNotNull'からすべての日付が正しく戻ってきます。私は問題が 'clone()。clearTime()'コードのこの行であると思います... –

1

私はのようなものを持っているために容易になるだろう...あなたはどこかに設計上の問題があると思います

これで、「days」変数には、タスクが関連付けられたデータベースに存在するユニークな日の文字列の配列が含まれています。

あなたが一日でタスクをリストしたい場合は、その後、行うことができます。

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

あなたの言うことは正しいですか?私の主な目的は、毎日のすべてのタスクをレンダリングすることです。今問題は、私のテーブルからすべての可能な 'todaysDate'に対して' findAllByStartTimeBetween(date1、date2) 'をどのように使用するのでしょうか?なぜ私はそれらを使用していない..... ..... –

+1

grails 2.0を使用できますか?それは新しい場所で簡単になります。クエリの構文と使用方法は次のとおりです。http://www.grails.org/doc/2.0.0/guide/GORM.html#whereQueriesを参照して、「その他関数 "の章... – Philippe

+0

Yupはすぐに移行します。そして、@ataylorが言ったように、' groupBy'メソッドは(私の場合は)非常によく仕事をします。あなたの答え... –

関連する問題