查询,本机查询,命名查询和类型查询之间的区别


69

查询,本机查询,命名查询和类型查询之间有什么区别?“独立”查询是否存在,还是只是缩写?在我看来,本机查询是用简单sql编写的查询,而命名查询与实体(休眠映射)有关。有人可以简要解释一下吗?

Answers:


78

询问

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

在JPA中,您可以使用创建查询entityManager.createQuery()。您可以查看API以获得更多详细信息。

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

本机查询

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

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

命名查询

类似于常量的定义方式。NamedQuery是通过给查询命名来定义查询的方式。您可以在休眠的映射文件中定义此定义,也可以在实体级别使用注释定义。

类型查询

当您创建查询时,TypedQuery提供了一个选项来提及实体的类型,因此此后的任何操作都不需要显式转换为预期的类型。普通QueryAPI不会返回您期望的确切类型的对象,而您需要进行转换。


12
不同查询之间是否存在性能,吞吐量,内存消耗,负载应用服务器之间的差异?我认为NamedQuery的内存消耗大于查询,但是我不能说选择支持一个或另一个查询的限制在哪里。你能解释一下吗?在此先感谢
Joe

7
由于缺少更好的地方来提及这一点,因此我要补充一点,应该非常小心地将Hibernate非本地查询转换为本地查询,尤其要注意从本地查询返回时如何处理空值。我的团队最近看到了一些怪异的SQLGrammarException:无法提取ResultSetORA-00932:数据类型不一致:当未考虑潜在的空值时,预期的NUMBER出现了BINARY错误。也许有人会偶然发现此评论,并在知道了这一小技巧后更快地解决他们的问题。
Marc
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.