JPA的查询语言:JPQL的命名查询

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

也会让你心无旁骛,更会让你的心灵得到解脱和抚慰。

JPA的查询语言:JPQL的命名查询

相关文章:

你感兴趣的文章:

标签云: