JPA的命名查询实际上就是给查询语句起个名字,执行查询的时候就是直接使用起的这个名字,避免重复写JPQL语句,使查询在代码中得到更多的重用。我不怎么喜欢使用命名查询,因为我不想把查询语句写在实体中,使得实体看起来变得复杂臃肿。广州最好的java培训机构
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.
24. @Id
25. @GeneratedValue
26. private Long id;
27.
28.
31. @Column(name="name")
32. private String name;
33.
34.
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.
64. }
简单的测试:
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 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 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 users = query.getResultList();
55. }
56. }
QQ 744437114
疯狂java视频 android视频:http://www.fkjava.org/video.html