2017-09-29 7 views
0

Comment traduire le 3 tableau requête SQL suivante pour Grails?requête SQL pour Translating 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 

J'ai essayé quelque chose de similaire mais ne savez pas comment faire les jointures

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

Ou peut-être il est mieux/plus facile si je tente d'utiliser

Topic.executeQuery(..insert sql..) 

En cas il aide, je article et sujet des objets Gorm et à l'article

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

Pourquoi prendre la peine avec tout ce que lorsque vous pouvez simplement utiliser la requête SQL tel quel? Il n'y a rien de mal avec les requêtes SQL. –

Répondre

0

Todd. En Grails vous pouvez utiliser hiberner requêtes SQL natives comme décrit dans ce post par M. hacki.

Je partage un exemple tiré de code dans la production qui utilise la technique décrite dans la publication et utilise jointure gauche.

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 
} 

je l'espère, il est utile pour vous