`
zhb8015
  • 浏览: 399972 次
  • 性别: Icon_minigender_1
  • 来自: 北京
博客专栏
Group-logo
Spring Roo杂谈
浏览量:0
社区版块
存档分类
最新评论

JPA namedQuery讲解

阅读更多

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实体:

  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.     /**  
  22.      * 主键  
  23.      */ 
  24.     @Id 
  25.     @GeneratedValue 
  26.     private Long id;  
  27.        
  28.     /**  
  29.      * 名字  
  30.      */ 
  31.     @Column(name="name")  
  32.     private String name;  
  33.        
  34.     /**  
  35.      * 密码  
  36.      */ 
  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.        

简单的测试:

 

  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<User> 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<User> 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<User> users = query.getResultList();  
  55.     }  
分享到:
评论

相关推荐

    jpa 全面学习资料

    - **查询操作**: 使用`find()`, `createQuery()`, `NamedQuery`等方式获取数据。 - **事务管理**: JPA支持声明式和编程式事务控制,确保数据一致性。 **4. JPA注解** JPA注解是实现ORM的关键,例如: - **@Table**:...

    JPA环境搭建源代码

    `JpaDemo1`可能还包含了查询实体的示例,例如使用`@NamedQuery`或`TypedQuery`: ```java @NamedQuery(name = "findAllUsers", query = "SELECT u FROM User u") ``` 或 ```java TypedQuery&lt;User&gt; query = em....

    09_传智播客JPA详解_使用JPQL语句进行查询

    7. **命名查询和查询注解**:介绍预定义的命名查询,以及在实体类上使用@NamedQuery和@Query注解的方式,提高代码的可读性和维护性。 8. **案例实战**:结合实际项目,演示如何在Java代码中执行JPQL语句,以及如何...

    IBM最新spring2.0+JPA教程加源代码

    JPA 2.0 版本引入了更多的功能,如 Criteria 查询、 NamedQuery 和 Native Query,以及支持多态性、延迟加载等高级特性。 在Spring 2.0中集成JPA,可以利用Spring的数据访问抽象层,如JdbcTemplate和...

    jpa-cliente

    此外,还可以使用`@NamedQuery`或`@NamedNativeQuery`来预定义查询。JPA还支持 Criteria API,用于动态构建查询。 5. **事务管理**:JPA支持事务控制,可以配合Spring框架使用声明式事务管理,简化代码中的事务处理...

    企业级EJB3高级培训PPT4

    开发者可以使用@NamedQuery或@NamedQuery方法定义预编译的SQL查询,提高代码的可读性和性能。 消息驱动bean(Message-Driven Beans,MDB)是EJB3中的另一个关键组件,它们负责处理JMS(Java Message Service)消息...

    EJB3多对多关系映射实例

    4. **查询操作**:EJB3提供了方便的查询API,如JPA的`@NamedQuery`或`Criteria API`,可以用来检索多对多关系的数据。例如,根据用户获取其所有角色: ```java @NamedQuery(name = "getUserRoles", query = "SELECT...

    企业级EJB3高级培训PPT5

    JPA允许使用`@NamedQuery`和`@NamedNativeQuery`进行预定义的查询,提高代码的可读性和性能。 在并发处理上,EJB3提供了线程安全的有状态会话bean,可以处理多个客户端请求,同时保持会话状态。而无状态会话bean则...

    EntityBeanOne2One

    - Entity Bean可以使用@NamedQuery或@NamedNativeQuery进行预定义的查询,提高性能和代码可读性。 4. **一对一关系的配置**: - 配置一对一关系时,需要考虑是否设置optional属性为false,这将强制规定关系必须...

    EJB3 实例教程(JBoss+Eclipse+Ant)

    这大大简化了数据库操作,如`@NamedQuery`可以用于预定义SQL查询。 本教程可能包含以下章节: 1. **EJB3基础**:介绍EJB3的主要概念,包括实体Bean、会话Bean和消息驱动Bean的基本用法。 2. **JBoss应用服务器设置...

    Java EE 6 tutorial 配套example代码

    5. **JPA**:Java EE 6中的JPA 2.0加强了ORM能力,如 Criteria API 和 Named Query。示例可能展示了如何定义实体类,使用注解配置数据映射,以及执行CRUD操作。 6. **CDI(Contexts and Dependency Injection)**:...

    eclipselink的crud

    - 使用预编译的`NamedQuery`或`NamedNativeQuery`提升查询效率。 - 熟悉JPA和EclipseLink的特性,如懒加载、级联操作等,以便有效利用它们。 通过上述讲解,你应该对如何在EclipseLink中进行CRUD操作有了基本的理解...

    hibernate_annotation_中文帮助文档

    - **EJBQL/HQL**:使用`@NamedQuery`或`@NamedNativeQuery`声明预定义的查询。 - **本地化查询**:支持多语言查询语句。 4. **Hibernate独有的注解扩展** - `@Entity`、`@Id`、`@Column`等是标准的JPA注解,而`@...

    hibernate_Annotations

    - **JP-QL/HQL查询映射**:使用`@NamedQuery`注解来定义命名查询,可以在运行时调用这些查询。 - **原生SQL查询映射**:使用`@SQL`注解来定义原生SQL查询。 #### 四、Hibernate注解扩展 除了JPA标准注解外,...

Global site tag (gtag.js) - Google Analytics