JPA/Hibernate:命名查询与本机查询 |使用哪一个?
JPA/Hibernate: Named Query vs Native Query | Which one to use?
有开发者编写的本机查询
String sql = "Select * from TERP_META where id=" + id + " and type='KCH' ORDER BY ID ASC";
return entityManagerMaster.createNativeQuery(sql, TerpStatus.class).getResultList();
我们也可以为这个写命名查询。
现在对于简单的查询,我们应该使用 Native 还是 Named?
我知道 Native 应该用于复杂的查询,而对于简单的 Named 则使用但不知道原因。
任何人都可以阐明两者在执行方面的技术差异以从两者中选择最佳吗?
它根本不是命名与本机查询,因为您可以使用命名本机查询。本机是 SQL 查询,而在 JPA 世界中,non-native 指的是使用 JPQL——一种基于 java 实体的不同查询语言。您选择哪一个取决于您的应用程序要求,因为通常更多的数据库特定功能只能通过特定于数据库的(本机)SQL.
我个人不喜欢搜索 SQL 查询以在整个应用程序代码中找到它们,并在以影响模式的方式更改模型时找出问题 - 使用 JPQL 让 JPA 验证查询预先针对模型,而不必针对数据库执行 SQL 查询。与我一起工作的开发人员并不总是理解或使用 SQL 表,因此 JPQL 更接近于他们使用的格式(java 对象)中的数据。它还减少了 problems/risks 人们使用字符串连接构建 SQL 查询,并在该查询字符串中使用一些客户定义的值 - SQL 注入攻击的常见向量。
@Chris 已经给出了很好的回答。我只是把我的观点放在这里
命名查询:
NamedQuery 在编译时被验证,因此它们已经被验证。因此它们在运行时不太容易出现异常。
在我看来,对非常常用的方法使用 NamedQuery 更好。
本机查询:
它们的编写方式与您在 Sqlyog 等数据库客户端中编写查询的方式相同。最好只在遇到复杂而长的查询时才编写它们。正如@Chris 所说“SQL 注入攻击的常见载体”。
有开发者编写的本机查询
String sql = "Select * from TERP_META where id=" + id + " and type='KCH' ORDER BY ID ASC";
return entityManagerMaster.createNativeQuery(sql, TerpStatus.class).getResultList();
我们也可以为这个写命名查询。
现在对于简单的查询,我们应该使用 Native 还是 Named? 我知道 Native 应该用于复杂的查询,而对于简单的 Named 则使用但不知道原因。
任何人都可以阐明两者在执行方面的技术差异以从两者中选择最佳吗?
它根本不是命名与本机查询,因为您可以使用命名本机查询。本机是 SQL 查询,而在 JPA 世界中,non-native 指的是使用 JPQL——一种基于 java 实体的不同查询语言。您选择哪一个取决于您的应用程序要求,因为通常更多的数据库特定功能只能通过特定于数据库的(本机)SQL.
我个人不喜欢搜索 SQL 查询以在整个应用程序代码中找到它们,并在以影响模式的方式更改模型时找出问题 - 使用 JPQL 让 JPA 验证查询预先针对模型,而不必针对数据库执行 SQL 查询。与我一起工作的开发人员并不总是理解或使用 SQL 表,因此 JPQL 更接近于他们使用的格式(java 对象)中的数据。它还减少了 problems/risks 人们使用字符串连接构建 SQL 查询,并在该查询字符串中使用一些客户定义的值 - SQL 注入攻击的常见向量。
@Chris 已经给出了很好的回答。我只是把我的观点放在这里
命名查询: NamedQuery 在编译时被验证,因此它们已经被验证。因此它们在运行时不太容易出现异常。 在我看来,对非常常用的方法使用 NamedQuery 更好。
本机查询: 它们的编写方式与您在 Sqlyog 等数据库客户端中编写查询的方式相同。最好只在遇到复杂而长的查询时才编写它们。正如@Chris 所说“SQL 注入攻击的常见载体”。