3

私はこのようなgrailsドメインを持っています

Point {
  User user
  Date assignedDate = new Date()
  consumed = false
}

user, count(consumed=true), count(consumed=false) で行を返すクエリを実行したい

たとえば、データで

| USER | DATE | CONSUMED |
___________________________
|   1  | ...  | true     |
|   1  | ...  | true     |
|   1  | ...  | false    |
|   2  | ...  | true     |
|   2  | ...  | false    |

クエリは次を返す必要があります。

| USER | CONSUMED | NOT CONSUMED |
_________________________________
|   1  | 2        | 1            |
|   2  | 1        | 1            |

ページネーションが必要なため、これを単一のクエリで行う必要があります。gorm 基準または hibernate HQL を使用する場合に最適です。

プロジェクションで遊んでみましたが、成功しませんでした。

何か案が?ありがとうございました

回避策

回避策として、Michael J. Lee によって提案された式で hibernate 式のマッピングを使用しました。

2 つのマップされたフィールドを追加しました

    点 {
          ユーザー ユーザー
          割り当てられた日付Date = new Date()
          消費=偽
          自由計算式:「CASE WHEN 消費 = 0 THEN 1 ELSE 0 END」
          notFree 式: 「CASE WHEN 消費 = 1 THEN 1 ELSE 0 END」
        }

そして、次のような基準クエリを使用します。

    Point.withCriteria{
      投影 {
          groupProperty('ユーザー')
          sum('無料')
          sum('notFree')
      }
    }

4

2 に答える 2

0

The way you have your data structured and the query that you want to return doesn't lend nicely to things like criteria queries and dynamic finders. I would suggest these two options depending on your level of experience and how much data you need to summarize.

1.) Create a stored procedure or use a named query (better with lots of data)...

SELECT
   user_id as 'USER',
   SUM(CASE WHEN consumed = 1 THEN 1 ELSE 0 END) as 'CONSUMED'
   SUM(CASE WHEN consumed = 0 THEN 0 ELSE 1 END) as 'NOT CONSUMED'
FROM 
   point
GROUP BY
    user_id

2.) Use groovy's collection closures to do the heavy lifting in grails (use with caution if you have lots of data)

def someControllerMethod() {
    def points = Point.list().groupBy{ it.user } //<-- or use a findAllBy or criteria
    def data = [];
    points.each{ point,values ->
        data << ['USER':point.user, 'CONSUMED':values.count{ it.consumed }, 'UNCONSUMED':values.count{ !it.consumed } ]
    }

   println("this is what it looks like ${data}");
   return data //<-- is a list of maps that should be easy to render in your gsp
}

Please note that I just did the coding off the top of my head and didn't verify the syntax

Hope this helps.

于 2012-04-19T12:45:20.840 に答える
-1

そのドメインに名前付きクエリを追加し、GROUP BY を使用してユーザーをグループ化します。select句でCOUNTを使用できます

于 2012-04-19T11:30:04.417 に答える