【发布时间】:2015-11-08 23:38:54
【问题描述】:
我们正在将一些遗留代码从 sql 重写为带有 hibernate 的 gorm。 我偶然发现了一个问题——我们有 4 个不同的表,映射到 4 个域类。它们中的每一个都有一个名称相同的列/属性。 考虑以下(实际上很愚蠢)表进行简化:
+-------------------+ +---------------------------+
| id | name | role | | id | position | role |
+-------------------+ +---------------------------+
| 1 | John | admin | | 1 | manager | admin |
| 2 | Bob | user | | 2 | sysadmin | superuser |
+-------------------+ +---------------------------+
从这些表/类中,我需要提取所有不同角色。 使用 SQL,这可以通过 union 轻松完成:
SELECT role FROM Table1 UNION SELECT role FROM Table2 GROUP BY role
返回所需结果:[admin, user, superuser]
现在我想知道,如何使用 gorm/hibernate 来做到这一点。一种可能的解决方案是使用以下两个标准:
first = Table1.createCriteria().list {
projections {
distinct "role"
}
}
second = Table2.createCriteria().list {
projections {
distinct "role"
}
}
然后遍历它们并过滤重复项。然而,这不是很有效,几乎是原始查询时间的两倍(给定 4 个表,有效地导致 4 个查询)。 那么,最有效(时间和资源)的解决方案是什么?
// 更新(响应@Emmanuel)
我无法控制数据库。我的访问是只读的。更可怕的是,表中总共有大约 400 万行。这些数据会定期更新,每分钟都会添加新行,因此无法在某处创建新表。
【问题讨论】:
标签: hibernate grails grails-orm