查询、本地查询、命名查询和类型化查询之间的区别

83

查询、本地查询、命名查询和类型化查询有什么区别?'独立'查询是否存在,还是只是一个缩写?在我看来,本地查询是指简单 SQL 编写的查询,而命名查询涉及实体(Hibernate 映射)。有人能简要解释一下吗?

1个回答

89

查询

查询是指使用类似于SQL的语法,通常用于执行DML语句(CRUD操作)的JPQL/HQL 查询。

在JPA中,您可以使用 entityManager.createQuery() 创建查询。您可以查看API了解更多详情。

在Hibernate中,您使用 session.createQuery()

本地查询

本地查询是指实际的SQL查询(引用实际数据库对象)。这些查询是可直接在数据库中使用数据库客户端执行的SQL语句。

JPA: entityManager.createNativeQuery() Hibernate(非JPA实现):session.createSQLQuery()

命名查询

类似于常量如何定义。命名查询是通过给查询赋予一个名称来定义查询的方式。您可以在Hibernate映射文件中定义此查询,也可以在实体级别使用注释定义。

类型化查询

类型化查询为您提供了一种在创建查询时指定实体类型的选项,因此在此之后的任何操作都不需要对预期类型进行显式转换。而普通的Query API不返回您期望的精确对象类型,您需要进行强制类型转换。


14
不同查询之间是否存在性能、吞吐量、内存消耗和应用服务器负载方面的差异?我认为NamedQuery的内存消耗比查询大,但我无法确定在哪些查询方面选择更优。你能解释一下吗?谢谢。 - Joe
10
由于没有更好的地方提到这个问题,我想说一下,将Hibernate的非本地查询转换为本地查询时应该非常小心,尤其是关于如何处理从本地查询返回的空值。 最近,我的团队遇到了一些奇怪的_SQLGrammarException: could not extract ResultSet_和_ORA-00932: inconsistent datatypes: expected NUMBER got BINARY_错误,当潜在的null值没有被考虑进去时出现了这些错误。也许有人会偶然看到这个评论,并通过知道这个小技巧来更快地解决他们的问题。 - Marc
在createNativeQuery()方法中,我们可以传递类类型。这意味着我们的查询结果将映射到我们所提及的类吗?你能告诉我这是如何工作的吗? - Praveen kumar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接