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
    评论
JPA(Java Persistence API)是Java持久化规范,它提供了一种方便的方式来进行对象和关系数据库之间的映射。在JPA中,可以通过以下几种方式来获取控制生成的SQL语句: 1. 使用JPQL(Java Persistence Query Language):JPQL是一种面向对象的查询语言,类似于SQL。通过编写JPQL查询语句,可以获取到需要执行的SQL语句。使用EntityManager的createQuery方法创建Query对象,并通过getResultList或getSingleResult方法执行查询,从而获取到生成的SQL语句。 ```java String jpql = "SELECT e FROM Employee e"; Query query = entityManager.createQuery(jpql); List<Employee> employees = query.getResultList(); String sql = query.unwrap(org.hibernate.query.Query.class).getQueryString(); ``` 2. 使用Criteria API:Criteria API是一种类型安全的查询API,可以通过编程方式构建查询。通过CriteriaQuery对象和CriteriaBuilder对象,可以构建查询条件并获取生成的SQL语句。 ```java CriteriaBuilder cb = entityManager.getCriteriaBuilder(); CriteriaQuery<Employee> cq = cb.createQuery(Employee.class); Root<Employee> root = cq.from(Employee.class); cq.select(root); TypedQuery<Employee> query = entityManager.createQuery(cq); List<Employee> employees = query.getResultList(); String sql = query.unwrap(org.hibernate.query.Query.class).getQueryString(); ``` 3. 使用Native SQL:如果需要执行原生的SQL语句,可以使用createNativeQuery方法创建NativeQuery对象,并通过getResultList或getSingleResult方法执行查询,从而获取到生成的SQL语句。 ```java String nativeSql = "SELECT * FROM employee"; Query query = entityManager.createNativeQuery(nativeSql); List<Object[]> results = query.getResultList(); String sql = query.unwrap(org.hibernate.query.Query.class).getQueryString(); ``` 通过以上方法,可以获取到JPA生成的SQL语句,并进行相应的控制和调整。注意,以上示例中的sql变量获取到的是Hibernate生成的SQL语句,具体的实现可能会有所不同。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值