【问题标题】:Left Join with Sub Query in grails?在grails中使用子查询左连接?
【发布时间】:2016-04-03 05:38:45
【问题描述】:

如何在 Grails 中使用条件查询或 executeQuery 编写以下查询?

select * from table1 as t1 left  Join(select * from table2 where id=2)as t2 On  t2.table1=t1.id ;

【问题讨论】:

  • 如果你展示你的领域模型会更容易提供帮助。
  • 我很好奇,您为什么要使用条件查询或 HQL 来执行此操作,而不是使用已有的 SQL?

标签: spring hibernate grails grails-orm hibernate-criteria


【解决方案1】:

与查询表的 SQL 不同,GORM/Hibernate 查询查询域类。是的,它归结为表,但从 Criteria、WHERE 和 HQL 的角度来看,它是域类。这就是为什么,正如 Koloritnij 所指出的,领域模型的知识对于编写查询是必要的。

SQL 与 GORM

SQL 和 GORM 执行连接的方式的一个区别是 SQL 连接是在 SQL 本身中动态创建的。而 GORM 连接是由域类关联预先确定的。这意味着在 HQL 中您不能加入子查询。您可以阅读更多关于此类差异的信息here

一个例子

话虽如此,使用您的示例 SQL 我对您的域模型做了一个假设:

class DomainA {
}

class DomainB {
    DomainA a
}

在上面的域模型中,DomainB (table2) 有一个单向的 many-to-one associationDomainA (table1)。与您的 SQL 相似的 HQL 如下:

def hql = 'SELECT a, b FROM DomainB AS b RIGHT OUTER JOIN b.a AS a WHERE b.id = :id'

HQL 可以这样执行:

def result = DomainB.executeQuery(hql, [id: 2])

【讨论】:

  • 基本上我想对子查询的结果执行连接,如果我按照你的方式执行,那么将对连接结果执行 where 子句,我想在两个表上使用 where 条件然后想要加入那里的结果,比如联合。
  • 好吧,不幸的是 GORM/Hibernate 不支持加入子查询。联合与您演示的完全不同,也不支持。
【解决方案2】:

给你(如果你有带外键的域类):

def query
query = sessionFactory.getCurrentSession().createCriteria(table2.class)
query = query.createAlias("table1", "table1Alias",  CriteriaSpecification.LEFT_JOIN, Restrictions.in( 'table1Alias.id', 'table2.id'))
Restrictions.eq( "id", 2)

如果没有,你必须使用原始 SQL:

def dataSource
Sql sql = new Sql(dataSource)
sql.exequteQuery("""....""")

【讨论】:

    猜你喜欢
    • 2018-11-01
    • 1970-01-01
    • 2015-09-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多