hibernate - hibernate 列表与4个表不同

标签 hibernate grails gorm

我们正在使用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/

相关文章:

sql - 使用GORM的动态FindAllBy方法时出现SQL错误-未设置#2

grails - 防止保留未使用的数据库连接

grails - 在grails中保存域对象

rest - 测试 RESTful JSON Grails Web 服务

hibernate - 单元测试 JPA/hibernate : No Persistence provider for EntityManager

java - 实体管理器最佳实践

java - 嵌入式实体上的 Hibernate 过滤器

grails - Grails域类上缺少静态get方法

grails - 在Grails条件中使用SUBSTRING

java - 如何使用hibernate创建新的oracle数据库