我的问题是我不明白我怎么知道我必须使用Native查询而不是hibernate查询语言?
答案 0 :(得分:1)
当您无法使用HQL而必须使用本机时,至少有两个示例。
1)Hibernate通常不适合在运行时执行DDL类型的操作:
em.createNativeQuery("DROP TABLE IF EXISTS mytable").executeUpdate();
2)我可能在这方面是错的,但是afaik HQL查询通常看起来像"from MyClass as mc"
。这意味着您必须在那里有一个类的字符串化名称,有时您必须在运行时确定类。反过来,这会将您的HQL转换为类似hql = "from " + obj.getSimpleName() + " sn";
的丑陋形式。对于这种“多态”查询,以下方法会更干净:
em.createNativeQuery(someSql, getConcreteClass());
答案 1 :(得分:1)
要在此处获得第二个答案,通常最好在整个应用程序中依靠Hibernate查询(HQL)。这里的主要原因是Hibernate本身-如果让它管理所有获取和更新的实体以及数据,它的性能会更好。但是,如果采用本机查询,则Hibernate会忽略执行的实体更改,因此其工作效率降低。有多种方法可以弥合本机查询与Hibernate实体和ORM机制之间的鸿沟,但它们需要额外的仔细编码,并且既不十分灵活也不便于移植。
使用本地查询的原因(如其他人已经解释的那样)是因为需要执行DDL操作(Hibernate对结构更改感觉不好),或者明确需要依赖某些数据库供应商特定的SQL语法。例如,在将行返回给应用程序之前,应用表锁定提示或在数据库内进行基本数据处理。
除上述内容外,没有特殊原因可以返回本机查询。毕竟,能够避免编写裸露的SQL可能是您选择Hibernate的原因,不是吗?