JPA/Hibernate:命名查询vs本机查询|使用哪一个?



有开发人员编写的本机查询

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应该用于复杂的查询,而name用于简单的查询,但不知道原因。

谁能解释一下两者在执行上的技术区别是什么?

这根本不是命名vs原生查询,因为您可以使用命名原生查询。本机是SQL查询,而非本机,在JPA世界中,指的是使用JPQL——一种基于java实体的不同查询语言。您选择哪一个取决于您的应用程序需求,因为通常更多的DB特定的功能只能通过DB特定的(本机)SQL访问。

我个人不喜欢在应用程序代码中搜索SQL查询,并在以影响模式的方式更改模型时找出问题——使用JPQL可以让JPA预先验证对模型的查询,而不必对DB执行SQL查询。与我一起工作的开发人员并不总是理解或使用SQL表,因此JPQL更接近于他们使用的格式(java对象)中的数据。它还减少了人们使用字符串concat构建SQL查询的问题/风险,并在该查询字符串中使用一些客户定义的值-这是SQL注入攻击的常见向量。

@Chris已经回答得很好了。我只是把我的观点放在这里

NamedQuery:NamedQuery在编译时被验证,因此它们已经被验证过了。因此,它们在运行时不太容易出现异常。在我看来,对于经常执行的方法使用NamedQuery会更好。

原生查询:它们的编写方式与您在数据库客户端(如Sqlyog)中编写查询相同。建议只在有复杂和长查询时编写它们。正如@Chris所说的"SQL注入攻击的常见载体"。

最新更新