【问题标题】:Mix HQL and SQL in the same query在同一个查询中混合使用 HQL 和 SQL
【发布时间】:2009-10-08 15:33:40
【问题描述】:

我试图在同一个查询中混合使用 HQL 和 SQl。喜欢使用

"来自 ObjectA obj, TABLE_B tbl where obj.someProp = tbl.COLUMN"

因为我的客户需要修改查询,学习 HQL 或映射未映射的表是不可能的:(

如果不是休眠,有人知道另一个可以接受这个的 ORM 工具吗?另一个 JPA 实现,还是 JDO?

这个我试过了,当然不行。这对我来说也很有意义:结果没有映射到对象,所以没有某种编码就无法获取对象。我主要是在寻找为什么这不会很快奏效的原因。

【问题讨论】:

    标签: hibernate


    【解决方案1】:

    这确实行不通,我认为它永远不会,但不是因为“没有办法获取对象”。

    Hibernate确实允许您使用plain SQL queries 并提供许多不同的选项来将结果映射到您的实体(或非实体Java 对象)。您可以将查询编写为:

    SELECT table_A.*
      FROM table_A JOIN table_B on table_A.some_prop_column = tableB.other_column
     WHERE ...
    

    并通过以下方式从 Hibernate 执行它:

    List objectAs = session.createSQLQuery(yourQuerySQL).addEntity(ObjectA.class).list();
    

    混合 SQL 和 HQL 的问题在于它们之间很容易发生冲突 - 从 HQL 生成的 SQL 可能使用一个表别名,而原始 SQL 可能使用另一个;生成的 SQL 可能包含与原始 SQL 冲突的表/连接等...

    到头来,这一切都让你绝对什么都没有 - 它甚至不会帮助你的用例。如果您希望某人修改“混合”HQL / SQL 查询,他们仍然需要了解两者 SQL 和 HQL - 至少在区分两者所需的级别上。

    话虽如此,如果您的最终用户需要能够自定义该查询,也许您应该考虑使用Criteria API 以便根据用户的输入生成您需要的查询。除非您采取极端预防措施,否则让最终用户在应用程序中修改实际查询是一个巨大的安全漏洞。

    【讨论】:

    • 哇——效果很好。带有 SQL 和自动实体加载的非常酷且强大的功能!我一直害怕必须映射所有 HQL 实体才能执行一些简单的 SQL 连接来检索一种类型的实体。顺便提一句。使用 JPA/Hibernate 4.3.7 就这么简单:List< DAO > daos = em.createNativeQuery( sql , myDaoClass ).getResultList()
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多