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实体:
packagecom.cndatacom.jpa.entity; importjavax.persistence.Column; importjavax.persistence.Entity; importjavax.persistence.GeneratedValue; importjavax.persistence.Id; importjavax.persistence.NamedQueries; importjavax.persistence.NamedQuery; importjavax.persistence.Table; @Entity @Table(name="t_user") @NamedQueries({ @NamedQuery(name="findAllUser",query="SELECTuFROMUseru"), @NamedQuery(name="findUserWithId",query="SELECTuFROMUseruWHEREu.id=?1"), @NamedQuery(name="findUserWithName",query="SELECTuFROMUseruWHEREu.name=:name") }) publicclassUser{ /** *主键 */ @Id @GeneratedValue privateLongid; /** *名字 */ @Column(name="name") privateStringname; /** *密码 */ @Column(name="password") privateStringpassword; publicLonggetId(){ returnid; } publicvoidsetId(Longid){ this.id=id; } publicStringgetName(){ returnname; } publicvoidsetName(Stringname){ this.name=name; } publicStringgetPassword(){ returnpassword; } publicvoidsetPassword(Stringpassword){ this.password=password; } }
简单的测试:
packagecom.cndatacom.jpa.test; importjava.util.List; importjavax.persistence.EntityManager; importjavax.persistence.EntityManagerFactory; importjavax.persistence.Persistence; importjavax.persistence.Query; importorg.junit.After; importorg.junit.Before; importorg.junit.Test; importcom.cndatacom.jpa.entity.User; publicclassTestNamedQuery{ EntityManagerFactoryemf=null; @Before publicvoidbefore(){ //根据在persistence.xml中配置的persistence-unitname创建EntityManagerFactory emf=Persistence.createEntityManagerFactory("myJPA"); } @After publicvoidafter(){ //关闭EntityManagerFactory if(null!=emf){ emf.close(); } } @Test publicvoidtestNamedQuery1(){ EntityManagerem=emf.createEntityManager(); List<User>users=em.createNamedQuery("findAllUser").getResultList();//根据User实体中定义的命名查询 } @Test publicvoidtestNamedQuery2(){ EntityManagerem=emf.createEntityManager(); Queryquery=em.createNamedQuery("findUserWithId");//根据User实体中定义的命名查询 query.setParameter(1,2L); List<User>users=query.getResultList(); } @Test publicvoidtestNamedQuery3(){ EntityManagerem=emf.createEntityManager(); Queryquery=em.createNamedQuery("findUserWithName");//根据User实体中定义的命名查询 query.setParameter("name","李坏"); List<User>users=query.getResultList(); } }
也会让你心无旁骛,更会让你的心灵得到解脱和抚慰。