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 {
	
	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 testNamedQuery1() {
		EntityManager em = emf.createEntityManager();
		List<User> users = em.createNamedQuery("findAllUser").getResultList();//根據User實體中定義的命名查詢
	}
	
	@Test
	public void testNamedQuery2() {
		EntityManager em = emf.createEntityManager();
		Query query =  em.createNamedQuery("findUserWithId");//根據User實體中定義的命名查詢
		query.setParameter(1, 2L);
		List<User> users = query.getResultList();
	}
	
	@Test
	public void testNamedQuery3() {
		EntityManager em = emf.createEntityManager();
		Query query =  em.createNamedQuery("findUserWithName");//根據User實體中定義的命名查詢
		query.setParameter("name", "李壞");
		List<User> users = query.getResultList();
	}
}

  

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM