假设一个域类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/