JPA的查詢語言:JPQL的命名查詢
JPA的命名查詢實際上就是給查詢語句起個名字,執(zhí)行查詢的時候就是直接使用起的這個名字,避免重復(fù)寫JPQL語句,使查詢在代碼中得到更多的重用。我不怎么喜歡使用命名查詢,因為我不想把查詢語句寫在實體中,使得實體看起來變得復(fù)雜臃腫。
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方法傳入命名查詢的名稱創(chuàng)建查詢。
例如: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() {
- //根據(jù)在persistence.xml中配置的persistence-unit name 創(chuàng)建EntityManagerFactory
- emf = Persistence.createEntityManagerFactory("myJPA");
- }
- @After
- public void after() {
- //關(guān)閉EntityManagerFactory
- if(null != emf) {
- emf.close();
- }
- }
- @Test
- public void testNamedQuery1() {
- EntityManager em = emf.createEntityManager();
- List<User> users = em.createNamedQuery("findAllUser").getResultList();//根據(jù)User實體中定義的命名查詢
- }
- @Test
- public void testNamedQuery2() {
- EntityManager em = emf.createEntityManager();
- Query query = em.createNamedQuery("findUserWithId");//根據(jù)User實體中定義的命名查詢
- query.setParameter(1, 2L);
- List<User> users = query.getResultList();
- }
- @Test
- public void testNamedQuery3() {
- EntityManager em = emf.createEntityManager();
- Query query = em.createNamedQuery("findUserWithName");//根據(jù)User實體中定義的命名查詢
- query.setParameter("name", "李壞");
- List<User> users = query.getResultList();
- }
- }
原文鏈接:http://www.cnblogs.com/luxh/archive/2012/06/01/2531428.html