JPA 本地查询

前面章节介绍了使用 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}
说说我的看法
全部评论(
没有评论
关于
本网站专注于 Java、数据库(MySQL、Oracle)、Linux、软件架构及大数据等多领域技术知识分享。涵盖丰富的原创与精选技术文章,助力技术传播与交流。无论是技术新手渴望入门,还是资深开发者寻求进阶,这里都能为您提供深度见解与实用经验,让复杂编码变得轻松易懂,携手共赴技术提升新高度。如有侵权,请来信告知:hxstrive@outlook.com
公众号