`

JPA的查询语言—JPQL的命名查询@NamedQuery

 
阅读更多
http://www.cnblogs.com/luxh/archive/2012/06/01/2531428.html
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;
 
   ... ...
     
}


Hibernate简单测试
public void testFindByNamedQuery() {
        HashMap<String, Object> queryParams = new HashMap<String, Object>();
        queryParams.put("name", Constants.USER_ROLE);
        List<User> roles = dao.findByNamedQuery("findAllUser", queryParams);
    }


JPA简单的测试:
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();
    }
}
分享到:
评论

相关推荐

    09_JPA详解_使用JPQL语句进行查询.zip

    **JPQL(Java Persistence Query Language)**是JPA的一部分,它是面向对象的查询语言,类似于SQL,但专门用于处理JPA实体。JPQL允许开发者用面向对象的方式来构建查询,而不是直接写SQL,这使得代码更易于理解和...

    JPA JPQL常用

    命名查询是一种预定义的JPQL查询,可以在实体bean上通过`@NamedQuery`或`@NamedQueries`注解来声明。这样做可以提高代码的可读性和可维护性,特别是对于经常使用的查询。例如: ```java @NamedQuery(name = ...

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

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

    jpa查询详解

    JPQL(Java Persistence Query Language)是 JPA 中的一种查询语言,用于书写面向对象的查询语句。JPQL 查询可以用于检索、更新和删除数据。例如,在上面的示例代码中,我们使用了 JPQL 查询来检索 Person 实体: `...

    李勇JPA快速入门05_jpa中的查询

    Java Persistence Query Language(JPQL)是JPA提供的面向对象的查询语言,类似于SQL但更专注于对象模型。通过JPQL,开发者可以对实体进行检索、更新和删除操作。例如,查询所有用户可以写成:"SELECT u FROM User ...

    jpql查询[定义].pdf

    命名查询是预定义的JPQL查询,可以在实体类上通过`@NamedQuery`或`@NamedQueries`注解声明,这有助于减少重复代码和提高代码的可读性。例如: ```java @Entity @NamedQuery(name="getPerson", query="FROM Person ...

    spring中重要注解的应用和说明

    接着,我们来看`@NamedQueries`和`@NamedQuery`这两个注解,它们是关于JPA的命名查询功能。命名查询允许我们在实体类中定义预编译的JPQL(Java Persistence Query Language)查询语句,以提高查询的可重用性和可维护...

    JPA 标注 JPA标签手册

    - `@NamedQuery`, `@NamedNativeQuery`:预定义SQL或JPQL查询。 - `@SqlResultSetMapping`:定义SQL查询结果集的映射。 7. **其他**: - `@DiscriminatorColumn` 和 `@DiscriminatorValue`:用于多态继承时,...

    Spring Data JPA1.7中文文档

    查询方法支持多种策略,包括自动查询生成、使用 `@NamedQuery`、`@Query` 注解编写自定义 JPQL 查询,以及使用参数绑定和 SpEL 表达式。 3.4. **存储过程** Spring Data JPA 也支持调用数据库存储过程,通过 `@...

    JPA所有例子

    5. **查询操作**:使用JPQL或Criteria API进行查询,或者使用`@NamedQuery`预定义查询。 **JPA的优缺点**: 优点: 1. 提供了一种统一的API,减少了与特定数据库的耦合。 2. 支持面向对象的编程模型,易于理解和...

    spring data jpa 例子

    此外,`@NamedQuery`和`@NamedNativeQuery`可以定义预编译的查询,提高性能。 事务管理是Spring Data JPA的另一大优势。通过配置`@Transactional`注解,可以很容易地在方法级别控制事务的开始、提交或回滚。这使得...

    JPA构造器的使用样例

    这通常通过@NamedQuery或@Query注解在Repository接口中实现。 首先,我们需要定义一个实体类,这个实体类可能包含多个表的数据。例如,假设我们有两个相关的表`User`和`Address`,我们可以创建一个`UserProfile`类...

    hibernate-jpa.jar

    2. **查询语言**:Hibernate支持JPQL(Java Persistence Query Language),一种面向对象的查询语言,类似于SQL但更加面向对象。例如,@NamedQuery和@NamedNativeQuery用于定义预编译的查询。 3. **事务管理**:...

    Spring data JPA笔记资料

    6. JPQL(Java Persistence Query Language):这是JPA的查询语言,类似于SQL,但更面向对象。它允许开发者以声明式的方式执行查询。 7. NamedQuery:预定义的JPQL查询,可以在实体类上用@NamedQuery注解声明,方便...

    JPA 批注 参考

    JPA的核心组件包括实体(Entity)、实体管理器(EntityManager)、实体管理工厂(EntityManagerFactory)和查询语言(JPQL)。实体是JPA中的核心概念,代表数据库表的一行记录。通过`@Entity`注解标记类为实体,`@...

    jpa 全面学习资料

    - **查询语言(JPQL, Java Persistence Query Language)**: 类似于SQL,用于查询实体对象。 **3. JPA使用入门_基础** 入门教程通常包括以下内容: - **环境配置**: 如设置persistence.xml文件,配置数据源、实体...

    hibernate-jpa

    - 使用预编译查询(NamedQuery或Criteria API)提高性能。 - 注意实体的生命周期管理,避免内存泄漏。 总结来说,“Hibernate-JPA”是Java开发中一个强大且易用的数据持久化工具,通过遵循JPA规范,它为开发者提供...

    exemplo-jpa-pesquisa-com-jpql-criteria:例子

    Renato Ferreira-软件工程师 ...@NamedQuery:使用预定义参数的静态JPQL查询 使用条件的动态查询 条件查询 CriteriaBuilder 执照 根据MIT许可证分发。 有关更多信息,请参见LICENSE 。 接触 Renato Ferreira- - :

    EJB 3.0 持久性 API

    JPA引入了JPQL(Java Persistence Query Language),一种面向对象的查询语言,类似于SQL,但针对对象模型。开发者可以用JPQL编写复杂的查询,包括SELECT、FROM、WHERE、JOIN等子句。此外,还有@NamedQuery和@...

Global site tag (gtag.js) - Google Analytics