转载

JPA的查询语言:JPQL的命名查询

JPA的命名查询实际上就是给查询语句起个名字,执行查询的时候就是直接使用起的这个名字,避免重复写JPQL语句,使查询在代码中得到更多的重用。我不怎么喜欢使用命名查询,因为我不想把查询语句写在实体中,使得实体看起来变得复杂臃肿。

1、使用@NamedQuery注解在实体类中定义命名查询。

@NamedQuery(name="findAllUser",query="SELECT u FROM User u")

@NamedQuery中的属性name指定命名查询的名称,query属性指定命名查询的语句。

如果要定义多个命名查询,需要使用@NamedQueries。

@NamedQueries({
@NamedQuery(name="findAllUser",query="SELECT u FROM User u"),
@NamedQuery(name="findUserWithId",query="SELECT u FROM User u WHERE u.id = ?1"),
@NamedQuery(name="findUserWithName",query="SELECT u FROM User u WHERE u.name = :name")
})

2、定义好命名查询后,可以使用EntityManager的createNamedQuery方法传入命名查询的名称创建查询。

例如:createNamedQuery("findAllUser");

3、一个简单的例子。

简单的User实体:

  1. package com.cndatacom.jpa.entity;  
  2.    
  3. import javax.persistence.Column;  
  4. import javax.persistence.Entity;  
  5. import javax.persistence.GeneratedValue;  
  6. import javax.persistence.Id;  
  7. import javax.persistence.NamedQueries;  
  8. import javax.persistence.NamedQuery;  
  9. import javax.persistence.Table;  
  10.    
  11. @Entity 
  12. @Table(name="t_user")  
  13. @NamedQueries({  
  14.         @NamedQuery(name="findAllUser",query="SELECT u FROM User u"),  
  15.         @NamedQuery(name="findUserWithId",query="SELECT u FROM User u WHERE u.id = ?1"),  
  16.         @NamedQuery(name="findUserWithName",query="SELECT u FROM User u WHERE u.name = :name")  
  17.            
  18. })  
  19. public class User {  
  20.        
  21.     /**  
  22.      * 主键  
  23.      */ 
  24.     @Id 
  25.     @GeneratedValue 
  26.     private Long id;  
  27.        
  28.     /**  
  29.      * 名字  
  30.      */ 
  31.     @Column(name="name")  
  32.     private String name;  
  33.        
  34.     /**  
  35.      * 密码  
  36.      */ 
  37.     @Column(name="password")  
  38.     private String password;  
  39.    
  40.     public Long getId() {  
  41.         return id;  
  42.     }  
  43.    
  44.     public void setId(Long id) {  
  45.         this.id = id;  
  46.     }  
  47.    
  48.     public String getName() {  
  49.         return name;  
  50.     }  
  51.    
  52.     public void setName(String name) {  
  53.         this.name = name;  
  54.     }  
  55.    
  56.     public String getPassword() {  
  57.         return password;  
  58.     }  
  59.    
  60.     public void setPassword(String password) {  
  61.         this.password = password;  
  62.     }  
  63.        

简单的测试:

  1. package com.cndatacom.jpa.test;  
  2.    
  3. import java.util.List;  
  4.    
  5. import javax.persistence.EntityManager;  
  6. import javax.persistence.EntityManagerFactory;  
  7. import javax.persistence.Persistence;  
  8. import javax.persistence.Query;  
  9.    
  10.    
  11. import org.junit.After;  
  12. import org.junit.Before;  
  13. import org.junit.Test;  
  14.    
  15. import com.cndatacom.jpa.entity.User;  
  16.    
  17. public class TestNamedQuery {  
  18.        
  19.     EntityManagerFactory emf = null;  
  20.        
  21.     @Before 
  22.     public void before() {  
  23.         //根据在persistence.xml中配置的persistence-unit name 创建EntityManagerFactory  
  24.         emf = Persistence.createEntityManagerFactory("myJPA");  
  25.     }  
  26.        
  27.     @After 
  28.     public void after() {  
  29.         //关闭EntityManagerFactory  
  30.         if(null != emf) {  
  31.             emf.close();  
  32.         }  
  33.     }  
  34.        
  35.     @Test 
  36.     public void testNamedQuery1() {  
  37.         EntityManager em = emf.createEntityManager();  
  38.         List<User> users = em.createNamedQuery("findAllUser").getResultList();//根据User实体中定义的命名查询  
  39.     }  
  40.        
  41.     @Test 
  42.     public void testNamedQuery2() {  
  43.         EntityManager em = emf.createEntityManager();  
  44.         Query query =  em.createNamedQuery("findUserWithId");//根据User实体中定义的命名查询  
  45.         query.setParameter(1, 2L);  
  46.         List<User> users = query.getResultList();  
  47.     }  
  48.        
  49.     @Test 
  50.     public void testNamedQuery3() {  
  51.         EntityManager em = emf.createEntityManager();  
  52.         Query query =  em.createNamedQuery("findUserWithName");//根据User实体中定义的命名查询  
  53.         query.setParameter("name""李坏");  
  54.         List<User> users = query.getResultList();  
  55.     }  

正文到此结束
Loading...