我们正在使用Hibernate从sql重新编写一些遗留代码到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个查询)。
那么,最有效的(时间和资源)解决方案是什么?
// UPDATE(响应@Emmanuel)
我不受数据库的控制。我的访问权限是只读的。为了使它更加可怕,表中总共有大约400万行。这些数据会定期更新,并且每分钟都会添加新行,因此无法在某处创建新表。
最佳答案
GORM /休眠不支持UNION查询。我建议对表进行规范化,以使该列(例如角色)在单个表中,而其他表则通过外键引用它。使用表示例:
+-----------------+
+ id | role +
+-----------------+
+ 1 | admin +
+ 2 | user +
+ 3 | superuser +
+-----------------+
+-------------------+
+ id | name | role +
+-------------------+
+ 1 | John | 1 +
+ 2 | Bob | 2 +
+-------------------+
+---------------------------+
+ id | position | role +
+---------------------------+
+ 1 | manager | 1 +
+ 2 | sysadmin | 3 +
+---------------------------+
然后,您当然可以简单地查询新的域类。
关于hibernate - hibernate 列表与4个表不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33600374/