【问题标题】:Hibernate complex queryHibernate 复杂查询
【发布时间】:2009-10-05 16:52:49
【问题描述】:

我正在尝试对 MySQL 数据库执行查询。 该查询相当复杂,它有 5 个内部连接,包括 1 个自身连接和 它从 2 个不同的表中返回 3 条信息。 我们正在使用休眠,直到现在我只将它用于简单的查询。 我已经编写了 sql 查询并对其进行了测试。我想知道如何使用 hibernate,我可以用hibernate执行普通的sql语句吗?如果是这样,我需要一个单独的 hbm.xml 吗? 如果我使用休眠并执行普通的 sql 查询,我以后还能使用缓存吗?

【问题讨论】:

    标签: sql hibernate


    【解决方案1】:

    是的,您可以使用 Hibernate execute plain SQL queries

    不,您不需要单独的 hbm.xml 映射文件(除非您想要将 sql 查询与其他查询分开,在这种情况下您可以这样做)。您可以map your named SQL query 使用与命名 HQL 查询相同的方式。

    您是否能够“利用缓存”取决于您对“缓存”的确切理解以及您将如何映射 SQL 查询;不知道更多细节是不可能回答的。

    话虽如此,您可能不需要求助于 SQL 查询; HQL 非常强大,并且很有可能(假设存在适当的映射)将您的查询编写为 HQL。您可以发布相关的映射/架构和您的 SQL 查询吗?

    【讨论】:

    • 非常感谢您的回复。我只是想知道在 Hibernate 中使用 HQL 而不是 Native SQL 有什么好处?鉴于时间框架,我想选择可以快速完成的事情。
    • HQL 通常不那么令人头疼——您不必处理将结果映射回对象的问题;缓存很容易配置;您不必处理会话数据不一致等问题……但同样,这实际上取决于您要执行的操作 - 对于只读查询,检索一些字段 SQL 可能更合适。
    【解决方案2】:

    我强烈推荐条件查询而不是 HQL 查询。它们在不牺牲任何表达能力的情况下更接近您的程序代码。然而,它们确实依赖于要显式映射的关系,否则它们会变得相当复杂。

    为了加快开发速度,设置属性 hibernate.show_sql=true,并在调试器中玩系统,使用 IDE+jvm 的“重新加载修改的类”和“丢弃堆栈帧”功能,直到发出的 SQL 看起来像你发布的那个。

    【讨论】:

    • 你一定是在开玩笑。即使忽略 Criteria API 与 HQL 相比受到严重限制的事实,您也不能认真地说阅读 50 行 .add(Property.forName("whatever").eq(value)) 比阅读相应的 SQL 更容易吗?当您尝试将已经工作的 SQL 查询转换为 Hibernate 时,这会加倍。
    • 你的意思是add(Restrictions.eq("whatever", value))
    • 是的,在许多情况下它会更好,例如当限制条件是保存连接 where 子句时。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-18
    • 1970-01-01
    • 1970-01-01
    • 2013-06-28
    相关资源
    最近更新 更多