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;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
简单的测试:
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();[size=medium][/size]
}
@Test
public void testNamedQuery3() {
EntityManager em = emf.createEntityManager();
Query query = em.createNamedQuery("findUserWithName");//根据User实体中定义的命名查询
query.setParameter("name", "李坏");
List<User> users = query.getResultList();
}
}
分享到:
相关推荐
**JPQL(Java Persistence Query Language)**是JPA的一部分,它是面向对象的查询语言,类似于SQL,但专门用于处理JPA实体。JPQL允许开发者用面向对象的方式来构建查询,而不是直接写SQL,这使得代码更易于理解和...
命名查询是一种预定义的JPQL查询,可以在实体bean上通过`@NamedQuery`或`@NamedQueries`注解来声明。这样做可以提高代码的可读性和可维护性,特别是对于经常使用的查询。例如: ```java @NamedQuery(name = ...
7. **命名查询和查询注解**:介绍预定义的命名查询,以及在实体类上使用@NamedQuery和@Query注解的方式,提高代码的可读性和维护性。 8. **案例实战**:结合实际项目,演示如何在Java代码中执行JPQL语句,以及如何...
JPQL(Java Persistence Query Language)是 JPA 中的一种查询语言,用于书写面向对象的查询语句。JPQL 查询可以用于检索、更新和删除数据。例如,在上面的示例代码中,我们使用了 JPQL 查询来检索 Person 实体: `...
Java Persistence Query Language(JPQL)是JPA提供的面向对象的查询语言,类似于SQL但更专注于对象模型。通过JPQL,开发者可以对实体进行检索、更新和删除操作。例如,查询所有用户可以写成:"SELECT u FROM User ...
命名查询是预定义的JPQL查询,可以在实体类上通过`@NamedQuery`或`@NamedQueries`注解声明,这有助于减少重复代码和提高代码的可读性。例如: ```java @Entity @NamedQuery(name="getPerson", query="FROM Person ...
接着,我们来看`@NamedQueries`和`@NamedQuery`这两个注解,它们是关于JPA的命名查询功能。命名查询允许我们在实体类中定义预编译的JPQL(Java Persistence Query Language)查询语句,以提高查询的可重用性和可维护...
- `@NamedQuery`, `@NamedNativeQuery`:预定义SQL或JPQL查询。 - `@SqlResultSetMapping`:定义SQL查询结果集的映射。 7. **其他**: - `@DiscriminatorColumn` 和 `@DiscriminatorValue`:用于多态继承时,...
查询方法支持多种策略,包括自动查询生成、使用 `@NamedQuery`、`@Query` 注解编写自定义 JPQL 查询,以及使用参数绑定和 SpEL 表达式。 3.4. **存储过程** Spring Data JPA 也支持调用数据库存储过程,通过 `@...
5. **查询操作**:使用JPQL或Criteria API进行查询,或者使用`@NamedQuery`预定义查询。 **JPA的优缺点**: 优点: 1. 提供了一种统一的API,减少了与特定数据库的耦合。 2. 支持面向对象的编程模型,易于理解和...
此外,`@NamedQuery`和`@NamedNativeQuery`可以定义预编译的查询,提高性能。 事务管理是Spring Data JPA的另一大优势。通过配置`@Transactional`注解,可以很容易地在方法级别控制事务的开始、提交或回滚。这使得...
这通常通过@NamedQuery或@Query注解在Repository接口中实现。 首先,我们需要定义一个实体类,这个实体类可能包含多个表的数据。例如,假设我们有两个相关的表`User`和`Address`,我们可以创建一个`UserProfile`类...
2. **查询语言**:Hibernate支持JPQL(Java Persistence Query Language),一种面向对象的查询语言,类似于SQL但更加面向对象。例如,@NamedQuery和@NamedNativeQuery用于定义预编译的查询。 3. **事务管理**:...
6. JPQL(Java Persistence Query Language):这是JPA的查询语言,类似于SQL,但更面向对象。它允许开发者以声明式的方式执行查询。 7. NamedQuery:预定义的JPQL查询,可以在实体类上用@NamedQuery注解声明,方便...
JPA的核心组件包括实体(Entity)、实体管理器(EntityManager)、实体管理工厂(EntityManagerFactory)和查询语言(JPQL)。实体是JPA中的核心概念,代表数据库表的一行记录。通过`@Entity`注解标记类为实体,`@...
- **查询语言(JPQL, Java Persistence Query Language)**: 类似于SQL,用于查询实体对象。 **3. JPA使用入门_基础** 入门教程通常包括以下内容: - **环境配置**: 如设置persistence.xml文件,配置数据源、实体...
- 使用预编译查询(NamedQuery或Criteria API)提高性能。 - 注意实体的生命周期管理,避免内存泄漏。 总结来说,“Hibernate-JPA”是Java开发中一个强大且易用的数据持久化工具,通过遵循JPA规范,它为开发者提供...
Renato Ferreira-软件工程师 ...@NamedQuery:使用预定义参数的静态JPQL查询 使用条件的动态查询 条件查询 CriteriaBuilder 执照 根据MIT许可证分发。 有关更多信息,请参见LICENSE 。 接触 Renato Ferreira- - :
JPA引入了JPQL(Java Persistence Query Language),一种面向对象的查询语言,类似于SQL,但针对对象模型。开发者可以用JPQL编写复杂的查询,包括SELECT、FROM、WHERE、JOIN等子句。此外,还有@NamedQuery和@...