前面章节介绍了使用 EntityManager 类的 createNamedQuery() 方法执行 JPQL 查询语句。使用 JPQL 语句可以完成大多数业务要求,但是一些特别的业务需要使用本地 SQL 语句才能完成。
在 EntityManager 类中,可以通过 createNativeQuery() 方法执行本地 SQL 语句。其中:
createNativeQuery(String sqlString):直接执行传递进来的SQL语句
createNativeQuery(String sqlString, Class resultClass):执行指定的本地SQL,将查询结果封装成指定的类型
createNativeQuery(String sqlString, String resultSetMapping):执行指定的本地SQL,将查询结果封装成指定的类型
下面将演示 OpenJPA 怎样去执行本地 SQL 语句,然后自动封装成 JavaBean。代码如下:
package com.hxstrive.openjpa; import com.alibaba.fastjson.JSONObject; import com.hxstrive.openjpa.entity2.User; import javax.persistence.*; import java.util.List; public class JPQLDemo8 { /** 持久化单元名称 */ private static final String PERSISTENCE_NAME = "openJPA2"; public static void main(String[] args) { EntityManagerFactory factory = Persistence.createEntityManagerFactory( PERSISTENCE_NAME, System.getProperties()); EntityManager em = factory.createEntityManager(); em.getTransaction().begin(); // 执行本地 SQL 语句 { Query query = em.createNativeQuery( "select id, name, age, salary from user where age<30"); List list = query.getResultList(); for(Object object : list) { Object[] objs = (Object[])object; System.out.println("id=" + objs[0] + " name=" + objs[1] + " age=" + objs[2] + " salary=" + objs[3]); } } // 执行本地 SQL 语句,且自动转换为 User 对象 { Query nativeQuery = em.createNativeQuery( "select id, name, age, salary from user where age<30", User.class); // org.hibernate.Query query = nativeQuery.unwrap(SQLQuery.class) // .setResultTransformer(Transformers.aliasToBean(Employee.class)); List<User> userList = nativeQuery.getResultList(); for(User user : userList) { System.out.println(user); } } // 执行本地 SQL 语句,且自动转换为 User 对象 { Query nativeQuery = em.createNativeQuery( "select id, name, age, salary from user where age<30", "userResult"); List<User> userList = nativeQuery.getResultList(); for(User user : userList) { System.out.println(user); } } em.getTransaction().commit(); factory.close(); System.out.println("finished."); } }
执行代码输出 SQL 日志如下:
select id, name, age, salary from user where age<30 id=4 name=用户-3 age=10 salary=4105.1895 id=10 name=用户-9 age=26 salary=6327.472 select id, name, age, salary from user where age<30 User{id=4, name='用户-3', age=10, salary=4105.1895} User{id=10, name='用户-9', age=26, salary=6327.472} select id, name, age, salary from user where age<30 User{id=4, name='用户-3', age=10, salary=4105.1895} User{id=10, name='用户-9', age=26, salary=6327.472}