【发布时间】:2016-02-04 05:44:49
【问题描述】:
我正在使用 Grails 访问一个共享数据库,该数据库由另一个应用程序的 ORM 创建并填充,并且希望在不修改底层表结构的情况下在其上执行 LEFT JOIN 和聚合函数。理想情况下,这应该发生在高级别的基础上,例如使用 HQL、Criteria 或类似方式。
这些表不相关,它们没有由外键定义的关系。这些表使用可用于执行连接的字符串标识符系统。
因此,到目前为止,我能找到在 Grails 中连接这些不相关表的唯一方法是使用原生 SQL 查询。 HQL 中的左连接需要表中定义的关系(例如,left join checkoutJournal.checkoutDate 需要 RentalCar 中的 checkoutJournal 字段,据我了解,这会在数据库表中添加额外的列)
我的域类看起来像这样 - 他们目前唯一做的就是表示数据库的表结构。
class RentalCar {
String identifier
static mapping = {
table 'rental_car'
}
...
}
class CheckoutJournal {
String identifier
String renterName
Date checkoutDate
static mapping = {
table 'checkout_journal'
}
...
}
class RepairJournal {
String identifier
String repairDescription
Date repairDate
static mapping = {
table 'repair_journal'
}
...
}
我要构建的结果数据集应该具有这种结构(以 JSON 表示法):
[
{
identifier: "xyz",
// = max checkout date from CheckoutJournal, identifier String NOT unique
lastCheckoutDate: "2015-10-31 20:06:17.738831",
// all repairDate entries from RepairJournal that match identifier,
// realized with aggregate function in SQL
repairHistory: [
"2015-10-31 20:06:17.738831",
"2015-10-30 20:06:17.738831",
"2015-10-29 20:06:17.738831"
]
}, {
// Another rental car with the same structure
...
}]
我对所需结果的原生 SQL 查询如下所示:
SELECT
rc.identifier,
coj.renterName,
array_agg(rej.repairDate)
FROM rental_car rc
LEFT JOIN checkout_journal AS coj
ON coj.identifier = rc.identifier
AND coj.checkout_date =
( SELECT max(checkout_date)
FROM checkout_journal c
WHERE rc.identifier = c.identifier )
LEFT JOIN repair_journal AS rej
ON rc.identifier = rej.identifier
GROUP BY rc.identifier, coj.renter_name
- 在不更改数据库的情况下实现我的查询的最佳方法是什么 方案?
我正在考虑使用与 CheckoutJournal 和 RepairJournal 的附加关系来子类化 RentalCar(将组合实体与基本实体分开)添加类似于
static mapping = {
checkoutJournal indexColumn: [name: "identifier", type: String],
joinTable: [column: "identifier"],
repairJournal indexColumn: [name: "identifier", type: String],
joinTable: [column: "identifier"]
加上一个标准
...
projections {
max "checkoutDate"
}
...
- 这是正确的方法并且不会改变表结构吗?
- 如何使用条件查询我的数据,表示
lastCheckoutDate的最大聚合以及我希望为repairHistory返回的数组?
非常感谢,非常感谢任何帮助。
亲切的问候
【问题讨论】:
标签: hibernate postgresql grails join hql