本文主要是介绍JPQL与NativeSQL,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
JPQL只有select、update和delete操作,没有insert操作,EntityManager.persist()也不是JPQL的一部分。select等四操作对应的EntityManager的方法为find、merge、remove、persist。
JPQL与SQL的语法很相近,但是使用JPQL的queries返回的是实体实例(具体类型而非抽象类型)的集合,而NativeSQL的queries返回的也是实体实例,而不是数据库表,但是类型全为Object而非Entity的具体类型。
JPQL处理的是JPA实体,而Native SQL处理的是相关的数据。
JPQL也支持查询实体的部分属性,但查询后返回的不再是实体对象,而是Object类型的对象。
如果进行批量更新或删除操作,您必须使用executeUpdate()方法(单个的更新有find+setter方法,单个的删除有find+remove),它返回已更新或删除的实体实例的数量。但是批处理操作executeUpdate最终转换成SQL并在数据库中执行,绕过了持久化环境(persistencecontext),因此不会将任何修改应用于受管理的实体,即托管状态被容器管理的实体并没有修改或更新。这时,需要用refresh()方法来刷新实体对象,容器将数据库中的最新值重写进实体对象。
NativeSQL,除了做select查询之外,还有另一种应用是调用存储过程。使用createNativeQuery()方法指明调用,之后用query.executeUpdate()、query.getResultList()、query.getSingleResult()来获取结果。
举例如下:有一个存储过程,名称为AddUser(),那么,em.createNativeQuery("{call AddUser()}")
JPQL操作的就是抽象持久化模型,即一个持久化单元(persistenceunit
)中实体所表示的模型。使用NativeSQL,你可以直接查询数据库中表的字段;使用JPQL,你可以查找实体的属性。一个JPQL语句的各个组成部分都是针对实体或者实体的属性进行操作。你根本不会用到一个实体所映射的数据库表和字段。
除实体名称和实体字段外,JPQL查询不区分大小写。所以在查询的其它部分你可以使用任意形式。
这篇关于JPQL与NativeSQL的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!