JPQL与NativeSQL比较

JPQL只有select、update和delete操作,没有insert操作,EntityManager.persist()也不是JPQL的一部分。select等四操作对应的EntityManager的方法为find、merge、remove、persist。

 

 JPQL语句不能直接被数据库执行,JPA中有一个JPQL解析器,它负责把JPQL转换为原生SQL语句,然后由数据库执行。

 

JPQL与SQL的语法很相近,但是使用JPQL的queries返回的是实体实例(具体类型而非抽象类型)的集合,而NativeSQL的queries返回的也是实体实例,而不是数据库表,但是类型全为Object而非Entity的具体类型。

JPQL处理的是JPA实体,而Native SQL处理的是相关的数据。

 

JPQL也支持查询实体的部分属性,但查询后返回的不再是实体对象,而是Object类型的对象。

 

如果进行批量更新或删除操作,您必须使用executeUpdate()方法(单个的更新有find+setter方法,单个的删除有find+remove),它返回已更新或删除的实体实例的数量。但是批处理操作executeUpdate最终转换成SQL并在数据库中执行,绕过了持久化环境(persistencecontext),因此不会将任何修改应用于受管理的实体,即托管状态被容器管理的实体并没有修改或更新。这时,需要用refresh()方法来刷新实体对象,容器将数据库中的最新值重写进实体对象。

 JPA执行原生SQL不会对实体进行跟踪,所以要避免导致数据库数据发生改变的的insert,update和delete语句,因为这种改变不会反映到实体中。

NativeSQL,除了做select查询之外,还有另一种应用是调用存储过程。使用createNativeQuery()方法指明调用,之后用query.executeUpdate()、query.getResultList()、query.getSingleResult()来获取结果。

 

举例如下:有一个存储过程,名称为AddUser(),那么,em.createNativeQuery("{call AddUser()}")

 

JPQL操作的就是抽象持久化模型,即一个持久化单元(persistenceunit)中实体所表示的模型。使用NativeSQL,你可以直接查询数据库中表的字段;使用JPQL,你可以查找实体的属性。一个JPQL语句的各个组成部分都是针对实体或者实体的属性进行操作。你根本不会用到一个实体所映射的数据库表和字段。

 

除实体名称和实体字段外,JPQL查询不区分大小写。所以在查询的其它部分你可以使用任意形式。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值