2009-10-08 51 views
3

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

“从对象A OBJ,表-B TBL其中obj.someProp = tbl.COLUMN”

,因为我的客户将需要修改查询,学习HQL或映射未映射表是出了问题:(

如果不是冬眠,不会有人知道另一个ORM工具,它可以接受吗?另一个JPA实现,或者JDO?

我试过这个,当然这是行不通的。这是有道理的我也是:结果没有映射到对象,所以没有任何编码就没有办法获得对象。我主要是在寻找原因这就是为什么这种方法不能很快奏效。

回答

10

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

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

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

,并从休眠通过执行:

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

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

而且它的结束,一切让你绝对没有 - 它甚至不会帮助你的使用情况。如果你希望有人修改一个“混合”的HQL/SQL查询,他们仍然需要知道这两个 SQL和HQL - 至少在区分这两者的必要级别。所有这一切说,如果您的最终用户需要能够自定义该查询,也许您应该查看使用Criteria API为了根据用户的输入生成您需要的查询。让最终用户修改应用程序中的实际查询是一个巨大的安全漏洞,除非您采取极端预防措施。

+0

哇 - 伟大的作品。 SQL和自动实体加载真的很酷且功能强大!我担心必须映射所有HQL实体才能执行一些简单的SQL连接来检索一种类型的实体。顺便说一句。使用JPA/Hibernate 4.3.7就像这样简单:'列表< DAO > daos = em.createNativeQuery(sql,myDaoClass).getResultList()' – 2015-09-09 13:29:08