前面章节介绍了使用 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}