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(); } }