日期:2014-05-16  浏览次数:20461 次

JPA的查询语言—JPQL的命名查询@NamedQuery
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实体:

package com.cndatacom.jpa.entity;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.Table;

@Entity
@Table(name="t_user")
@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")
        
})
public class User {
    
    /**
     * 主键
     */
    @Id
    @GeneratedValue
    private Long id;
    
    /**
     * 名字
     */
    @Column(name="name")
    private String name;
    
    /**
     * 密码
     */
    @Column(name="password")
    private String password;

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }
    
}
  简单的测试:

package com.cndatacom.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.cndatacom.jpa.entity.User;

public class TestNamedQuery {
    
    Entit