我正在尝试在同一个查询中混合使用HQL和SQl。喜欢使用
“来自ObjectA obj,TABLE_B tbl,其中obj.someProp = tbl.COLUMN”
因为我的客户端需要修改查询,学习HQL或映射未映射的表是不可能的:(
如果不是休眠,有人知道另一个可以接受这个的ORM工具吗?另一个JPA实现,还是JDO?
我试过这个,当然它不起作用。这对我来说也很有意义:结果没有映射到对象,因此没有一些编码就无法获得对象。我一直在寻找原因,为什么这不会很快发挥作用。
答案 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来根据用户的输入生成所需的查询。让最终用户修改应用程序中的实际查询是一个巨大的安全漏洞,除非你采取极端预防措施。