【问题标题】:Hibernate HQL to basic SQL (no joins)将 HQL 休眠到基本 SQL(无连接)
【发布时间】:2010-05-19 18:58:56
【问题描述】:

我正在使用 Hibernate 进行一个项目,我们需要用一些“自制持久性”的东西来替换 Hibernate。 想法是项目足够大,我们有很多 HQL 查询。 问题在于像

这样的查询
select a,b from table1, table2 on t1.table1=t2.table2

我们的“手工持久性”东西基本上不支持所有连接。

我需要的是能够做某种转码器,它将 HQL 查询作为输入并输出一些 SQL,但没有连接的 SQL

我希望你能明白。 我的持久层不支持连接。

有人对类似的事情有任何想法吗? 一些框架,还是什么?

【问题讨论】:

  • 没有冒犯,但是为一个本土的 ORM 扔掉一个既定的 ORM 是严重地重新发明轮子。了解更多关于优化 HQL 查询的信息会更好地为您服务,以便它们生成尽可能好的 SQL。
  • 我没有问如何改进 HQL。这不是想法。我无法解释更多关于我们为什么要更改休眠模式。改变hibernate我们有一些优势。
  • “已建立”并不意味着功能齐全或没有故障。 Hibernate 在某些领域存在一些严重的限制,这些限制在 5 年内没有得到解决。

标签: sql hibernate hql


【解决方案1】:

如果没有某种 JOIN,您将无法执行该示例 HQL 正在执行的操作。 你可以做的是在视图中实现连接,然后使用你自己开发的东西来查询视图。这使您与连接的实施隔离开来。在没有 JOIN 的情况下获得所需内容的唯一方法是查询每个表,然后将结果合并到代码中。

【讨论】:

  • 是的,这是一个想法,但我有超过 100 个查询,因此不可能为我拥有的每个连接创建视图。我需要一些通用的翻译器。我正在考虑类似hibernate如何翻译HQL,但是当它进行连接时,以某种方式改变。我需要的东西很复杂,但我真的需要它。
  • JOINS 就像他们说的那样,他们将两个或多个表的数据连接在一起,除了查询每个表并将它们合并到您的代码中之外,没有其他方法,这真的是不好的方法。本土化意味着本土化、手工制作的代码,仅来自最新鲜的部分。开始编码。
  • 当我伤心自制的时候,我的意思是我们买了这个,因为 hibernate 没有的一些优点,如果加入更重要的话。
【解决方案2】:

您似乎不想摆脱连接,而是用非常古老的 SQL89 形式来表达它们。无论哪种方式,它仍然是一个连接。

SQL92 语法:

SELECT FROM TABLE1 T1
JOIN TABLE2 ON T1.ID = T2.ID;

SQL89 语法:

SELECT FROM TABLE1 T1, TABLE2 T2
WHERE T1.ID = T2.ID; 

我很惊讶现在任何需要花钱的东西都无法支持近 20 年历史的语法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-26
    • 1970-01-01
    相关资源
    最近更新 更多