2017-09-29 12 views
0

次の3つのテーブルSQLクエリをGrailsにどのように変換しますか?SQLクエリをGrailsに翻訳する

SELECT t.name, count(*) as c 
FROM topic t 
LEFT OUTER JOIN article_topics at 
ON t.id = at.topic_id 
LEFT OUTER JOIN article a 
ON at.article_id = a.id 
GROUP BY t.name 

私はに似ていますが、

def criteria = Topic.createCriteria() 
    criteria.list { 
     groupProperty("name") 
     projections { 
      count('*') 
     } 
    } 

に参加するか、私はここで

Topic.executeQuery(..insert sql..) 

を使用しようとすると、多分それは/簡単にはましだ行う方法がわからない何かをしようとしてきましたそれは助けて、私は記事とトピックのGORMオブジェクトを持っていると記事

static mapping = { 
    topics lazy: false, joinTable: [name: 'article_topics', column: 'topic_id', key: 'article_id'] 
} 
+2

のために有用であると思いますか? SQLクエリには何も問題ありません。 –

答えて

0

Todd。 grailsでは、mr hackiによってこのpostに記載されているように、hibernateネイティブSQLクエリを使用できます。

私は、本書に記載された技術を使用し、左結合を使用する実例のコードから取った例を共有します。

List<Map<String, Object>> resumeInMonth(final String monthName) { 
    final session = sessionFactory.currentSession 
    final String query = """ 
     SELECT 
      t.id AS id, 
      e.full_name AS fullName, 
      t.subject AS issue, 
      CASE t.status 
       WHEN 'open' THEN 'open' 
       WHEN 'pending' THEN 'In progress' 
       WHEN 'closed' THEN 'closed' 
      END AS status, 
      CASE t.scheduled 
       WHEN TRUE THEN 'scheduled' 
       WHEN FALSE THEN 'non-scheduled' 
      END AS scheduled, 
      ifnull(d.name, '') AS device, 
      DATE(t.date_created) AS dateCreated, 
      DATE(t.last_updated) AS lastUpdated, 
      IFNULL(total_tasks, 0) AS tasks 
     FROM 
      tickets t 
       INNER JOIN 
      employees e ON t.employee_id = e.id 
       LEFT JOIN 
      devices d ON d.id = t.device_id 
       LEFT JOIN 
      (SELECT 
       ticket_id, COUNT(1) AS total_tasks 
      FROM 
       tasks 
      GROUP BY ticket_id) ta ON t.id = ta.ticket_id 
     WHERE 
      MONTHNAME(t.date_created) = :monthName 
     ORDER BY dateCreated DESC 
    """ 
    final sqlQuery = session.createSQLQuery(query) 
    final results = sqlQuery.with { 
     resultTransformer = AliasToEntityMapResultTransformer.INSTANCE 

     setString('monthName', monthName) 

     list() 
    } 

    results 
} 

私はあるとして、あなただけのSQLクエリを使用することができるときなぜすべてのことを気にします

関連する問題