跳转到内容


JPA使用原生SQL查询语句

Java JPA SQL

  • 您无法回复此主题
No replies to this topic

#1 冰力

    Administrator

  • 总版主
  • 1316 帖子数:

发表于 2016/12/22 00:51:39

EntityManager API 提供了创建 Query 实例以执行原生 SQL 语句的createNativeQuery方法。

实体User

package com.test.jpa.entity;
 
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Table;
 
@Entity
@Table(name="t_user")
public class User {
	  
    /**
	 * 主键
	 */
    @Id
    @GeneratedValue
    private Long id;
	  
    /**
	 * 名字
	 */
    @Column(name="name",length=50)
    private String name;
	  
    /**
	 * 密码
	 */
    @Column(name="password",length=20)
    private String password;
	  
    /**
	 * 邮箱
	 */
    @Column(name="email",length=50)
    private String email;
	  
    /**
	 * 年龄
	 */
    @Column(name="age",length=3)
    private int age;
	  
    public User() {
		  
    }
	  
    //以下省略getter/setter方法
    //......
}


测试代码:

package com.test.jpa.test;
 
import java.util.List;
 
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import javax.persistence.Query;
 
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
 
import com.test.jpa.entity.User;

/**
 * 测试JPA原生SQL查询
 * @author Luxh
 */
public class TestNativeQuery {
EntityManagerFactory emf = null;
	  
    @Before
    public void before() {
	    //根据在persistence.xml中配置的persistence-unit name 创建EntityManagerFactory
	    emf = Persistence.createEntityManagerFactory("myJPA");
    }
	  
    @After
    public void after() {
	    //关闭EntityManagerFactory
	    if(null != emf) {
		    emf.close();
	    }
    }
	  
		  
    /**
	 * 查询的结果是对象数组的集合
	 */
    @Test
    public void testNativeQuery1() {
	    EntityManager em = emf.createEntityManager();
	    //定义SQL
	    String sql = "SELECT * FROM t_user";
	    //创建原生SQL查询QUERY实例
	    Query query =  em.createNativeQuery(sql);
	    //执行查询,返回的是对象数组(Object[])列表,
	    //每一个对象数组存的是相应的实体属性
	    List objecArraytList = query.getResultList();
	    for(int i=0;i<objecArraytList.size();i++) {
		    Object[] obj = (Object[]) objecArraytList.get(i);
		   //使用obj[0],obj[1],obj[2]...取出属性    	   
	    }
	    em.close();
    }
	 
    /**
	 * 查询的结果是实体的集合
	 */
    @Test
    public void testNativeQuery2() {
	    EntityManager em = emf.createEntityManager();
	    //定义SQL
	    String sql = "SELECT * FROM t_user";
	    //创建原生SQL查询QUERY实例,指定了返回的实体类型
	    Query query =  em.createNativeQuery(sql,User.class);
	    //执行查询,返回的是实体列表,
	    List<User> userList = query.getResultList();
		  
	    em.close();
    }
	  
	  
    /**
	 * 查询单个属性
	 * 返回的是这个属性值的集合
	 */
    @Test
    public void testNativeQuery3() {
	    EntityManager em = emf.createEntityManager();
	    //定义SQL
	    String sql = "SELECT t.name FROM t_user t";
	    //创建原生SQL查询QUERY实例
	    Query query =  em.createNativeQuery(sql);
	    //执行查询,返回的是String类型的集合,因为name这个属性是String类型
	    List<String>  resultList = query.getResultList();
	    em.close();
    }
	 
    /**   
       * 查询多个属性
       * 返回的是这些属性值的数组的集合
       */   
    @Test   
    public void testNativeQuery4() {     
	    EntityManager em = emf.createEntityManager();    
	    //定义SQL		  
	    String sql = "SELECT t.name,t.age,t.email FROM t_user t";	    
	    //创建原生SQL查询QUERY实例	   
	    Query query =  em.createNativeQuery(sql);	 
	    //执行查询,返回的是查询属性值数组的集合	    
	    List objecArraytList = query.getResultList();
	    for(int i=0;i<objecArraytList.size();i++) {	   
		    Object[] obj = (Object[]) objecArraytList.get(i);
			 //使用obj[0],obj[1],obj[2]取出属性
	    }	    
	    em.close();  
		  
    }
}