grails - 将 SQL 查询转换为 Grails

标签 grails grails-orm

如何将以下 3 个表 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']
}

最佳答案

托德。在 grails 中,您可以使用本文 post 中所述的休眠原生 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
}

我希望它对你有用

关于grails - 将 SQL 查询转换为 Grails,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46494079/

相关文章:

使用 executeQuery() 对算术表达式进行 Grails 投影?

grails - 如何实现软删除

oracle - 从Grails连接到Oracle 12c数据库

grails - 加载插件管理器时出错:在GGTS 3.4.0上为null

grails - 组合来自 params 数组的标准

grails - 在 Grails 应用程序的数据库中存储和使用应用程序配置设置?

hibernate - Grails Controller "show"操作导致 2 个带有 "unique"约束的选择查询

grails - 根据传递给 Controller ​​的参数动态创建查询

javascript - 在 grails 中打开一个缩小尺寸的新窗口

java - 在 Tomcat Grails 中禁用缓存