【问题标题】:SQL to HQL with subqueries带有子查询的 SQL 到 HQL
【发布时间】:2010-11-23 20:20:48
【问题描述】:

我读到了 HQL 不支持子查询,但无论如何,谁能告诉我这个 SQL 查询是否可以用 HQL 实现?

我已经做了一些测试,但没有成功...不知道我是否走在正确的道路上...

SQL(工作)

SELECT foo.id as fooId, foo.name AS fooName, chan.name AS chanName, (SELECT DISTINCT foo_lang.VALUE FROM foo_lang WHERE foo_lang.foo_id = fooId AND foo_lang.lang_id = 1) as EN FROM foo INNER JOIN chan ON foo.chan_id = chan.id

HQL(不工作)

select new Map(o.id as id, o.name as fooName, c.name as chanName, (select fl.value from foo_lang fl where fl.id.fId = id and fl.id.lId = 1) as EN) from foo o left join o.chan c

它给出:

org.hibernate.TypeMismatchException: 二元逻辑运算符的左右手不兼容 [big_decimal : component[lId,rId]]

是关于子查询还是别的什么?

提前致谢。

【问题讨论】:

  • 我看到两个开括号,但只有一个闭括号。您是否尝试过修复它?
  • 谢谢。添加了右括号,但问题仍然存在。
  • 还有一个问题:这个表达式中的 fooId 是什么:foo_lang.foo_id = fooId AND。如果子查询将返回多行怎么办?有可能吗?

标签: sql hibernate hql


【解决方案1】:

我试图用一些不同的对象重现你的情况,但我不明白你为什么需要这个子查询。 AFAIK,从逻辑上讲,如果您将 foo_lang 加入 foo,这将是相同的,如下所示:

SELECT
 o.id,
 o.name as fooName,
 c.name as chanName,
 fl.value as EN
FROM foo AS o
LEFT JOIN o.chan AS c
LEFT JOIN o.foo_lang AS fl WITH fl.lang_id = 1

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-05-31
    • 2014-12-15
    • 1970-01-01
    • 1970-01-01
    • 2021-06-19
    • 2020-09-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多