4

我想用 HQL 做类似的事情:

SELECT *
FROM tableA a
INNER JOIN (select fieldA, sum(fieldB) as sum from tableB) b
ON a.fieldA = b.fieldA and a.fieldC = b.sum;

但这给出了一个错误:

org.hibernate.hql.internal.ast.QuerySyntaxException: unexpected token: (...

有什么方法可以使用 HQL 和 Hibernate 做到这一点?

4

3 回答 3

7

尝试原生 SQL解决方案:

需要先导入这个:

import org.hibernate.SQLQuery;

然后在您的代码中的某处:

SQLQuery query = session.createSQLQuery(
    "SELECT * FROM tableA a
    INNER JOIN 
    (SELECT fieldA, sum(fieldB) as sum from tableB) b
    ON a.fieldA = b.fieldA and a.fieldC = b.sum"
);

更多关于这个链接
和这里(加入休眠查询语言)

于 2012-08-02T12:17:54.883 回答
4

你可以尝试用 HQL 做这样的事情:

String sqlText = 
        "select entityA 
         from EntityA entityA, EntityB entityB 
         where entityA.fieldA=entityB.fieldA 
         and entityA.fieldC=(select sum(entityB.fieldB) 
                             from EntityB entityB 
                             where entityB.fieldA=entityA.fieldA)"

Query query = session.createQuery(sqlText);

它应该与您的 sql 类似。关于您的陈述-我知道您不能在 HQL 中使用内部视图,因为它是面向对象的。

这是一篇关于 HQL 中连接的好文章。

编辑:

根据 user1495181 的注释,上面的查询可以重写为(但我不确定):

String sqlText = 
        "select entityA 
         from EntityA entityA
         join entityA.entitiesB entityB
         Where entityA.fieldC=(select sum(entityB.fieldB) 
                             from EntityB entityB 
                             where entityB.fieldA=entityA.fieldA)"

但我更喜欢第一个变体,因为对我来说它更容易理解(尤其是对于曾经使用原生 SQL 的人来说)。

于 2012-08-02T12:58:55.090 回答
1

您不能使用 on 关键字定义连接。Hibernate 知道如何根据您的映射进行连接。如果您在 a 和 b 之间的映射中定义了一个关系,那么 hibernate 将根据您定义的关系进行连接。如果您在 a 和 b 之间存在关系,则在不使用 on 的情况下进行内部连接并将连接条件放在 where 子句中

于 2012-08-02T12:58:00.340 回答