grails - 获取Grails标准查询中的子对象计数

标签 grails gorm

假设一个域类A有许多类B对象。我需要执行返回的条件查询

  • A.id
  • A.名称
  • B.count(与A相关联的B个元素的总数)
  • B.last Updated(考虑到我具有所有B元素的last_updated日期,与A关联的B元素的最新更新日期)

    此外,查询应该足够灵活以向A和B域对象添加条件/限制。
    目前,我已经做到了:
    A.createCriteria().list {
        createAlias('b','b')
        projections{
            property('id')
            property('gender')
            property('dateOfBirth')
            count('b.id')
            property('publicId')
        }
    }
    

    但是问题在于,它仅返回一个对象,而子对象的计数是针对B的所有元素的,而不仅仅是与A相关的那些

  • 最佳答案

    最近,在一个类似的场景中,我需要一个查询,其中您的一行将以一对多关系存储许多行的计数。

    但是与您的情况不同,我使用native sql queries来解决查询。

    解决方案是使用派生表(我不知道如何使用条件查询来实现它们)。

    如果您觉得有用,我将与grails服务中的实现共享一个代码:

    List<Map> 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
        }
    

    感兴趣的部分是在主选择内声明一行,然后在声明的子句中声明派生查询,该查询将结果存储在与主选择中声明的同名行中
    SELECT ...
           total_tasks --Add the count column to your select
    FROM ticket t
    JOIN (SELECT ticked_id, COUNT(1) as total_tasks
          FROM tasks
          GROUP BY ticked_id) ta ON t.id = ta.ticked_id
    ...rest of query
    

    我从用户Aaron Dietz制作的answer分享到我也制定的question的最后一个示例

    希望对您有用

    关于grails - 获取Grails标准查询中的子对象计数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47747767/

    相关文章:

    javascript - 通过grails中的javascript更改输入字段值

    hibernate - Grails-如何在CreateCriteria中使用 “OR”

    grails - 使用Grails + PostgreSQL-如何调试GORM?

    sql-server - GRAILS 3 sql 表达 : no driver

    regex - 价格输入模式html5

    json - Grails GSON JSON View

    grails - 尝试获取ID类型不匹配

    grails - Grails:addTo()方法不适用于新创建的对象吗?

    hibernate - 对GORM中一对多属性的属性进行条件查询

    grails - 如何在不访问数据库的情况下 Hook Grails Spring Security的登录速率限制器?