GORM - 如何使用自引用左外连接创建条件查询

时间:2014-05-05 21:01:37

标签: sql grails left-join gorm self-join

我有一个具有以下结构的数据库表:

table Transaction {
    id BIGINT PRIMARY KEY
  , group VARCHAR(10)
  , subgroup VARCHAR(8)
  , createdOn DATETIME
}

我需要在我的应用程序中找到group / subgroup的所有最新事务。我知道如何在纯SQL中实现这一点。但是,由于这是Grails应用程序,我想使用Gorm来实现相同的结果。我已经搜索了Grails / Hibernate论坛,似乎有一些类似的结果我的问题,但是没有左外连接解决方​​案必须处理自引用连接。

这是我试图在Gorm中复制的SQL

SELECT t1.*
  FROM transaction as t1
  LEFT OUTER JOIN transaction as t2 
        ON (t1.group = t2.group 
        AND t1.subgroup = t2.subgroup
        AND t1.createdOn < t2.createdOn)
 WHERE t1.group = :someUserSuppliedGroup
   AND t2.subgroup = :someOptionalUserSuppliedSubgroup
   AND t2.id IS NULL

示例数据:

ID | Group | Subgroup | CreatedOn
 1   G1      SG1        01/01/2014 00:00:00 AM
 2   G1      SG1        01/01/2014 01:00:00 AM    
 3   G1      SG2        03/03/2014 03:00:00 PM
 4   G1      SG2        03/04/2014 03:00:00 PM

预期结果

ID | Group | Subgroup | CreatedOn
 2   G1      SG1        01/01/2014 01:00:00 AM
 4   G1      SG2        03/04/2014 03:00:00 PM

我暂时编写了一个解决方案,用于执行最新事务的分组和确定。这在初始数据库查询运行后发生。显然,我想重构我的代码,以便数据库完成繁重工作。

提前感谢您对可能解决方案的任何见解。我也对SQL使用相关子查询来确定正确数据的解决方案持开放态度。我只是认为这个SQL更简单。

0 个答案:

没有答案