在同一查询中混合使用HQL和SQL

时间:2009-10-08 15:33:40

标签: hibernate

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

“来自ObjectA obj,TABLE_B tbl,其中obj.someProp = tbl.COLUMN”

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

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

我试过这个,当然它不起作用。这对我来说也很有意义:结果没有映射到对象,因此没有一些编码就无法获得对象。我一直在寻找原因,为什么这不会很快发挥作用。

1 个答案:

答案 0 :(得分:10)

这确实不起作用,我认为它永远不会,但不是因为“没有办法获得对象”。

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来根据用户的输入生成所需的查询。让最终用户修改应用程序中的实际查询是一个巨大的安全漏洞,除非你采取极端预防措施。