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();
- }
- @Test
- public void testNamedQuery3() {
- EntityManager em = emf.createEntityManager();
- Query query = em.createNamedQuery("findUserWithName");//根据User实体中定义的命名查询
- query.setParameter("name", "李坏");
- List<User> users = query.getResultList();
- }
- }
相关推荐
- **查询操作**: 使用`find()`, `createQuery()`, `NamedQuery`等方式获取数据。 - **事务管理**: JPA支持声明式和编程式事务控制,确保数据一致性。 **4. JPA注解** JPA注解是实现ORM的关键,例如: - **@Table**:...
`JpaDemo1`可能还包含了查询实体的示例,例如使用`@NamedQuery`或`TypedQuery`: ```java @NamedQuery(name = "findAllUsers", query = "SELECT u FROM User u") ``` 或 ```java TypedQuery<User> query = em....
7. **命名查询和查询注解**:介绍预定义的命名查询,以及在实体类上使用@NamedQuery和@Query注解的方式,提高代码的可读性和维护性。 8. **案例实战**:结合实际项目,演示如何在Java代码中执行JPQL语句,以及如何...
JPA 2.0 版本引入了更多的功能,如 Criteria 查询、 NamedQuery 和 Native Query,以及支持多态性、延迟加载等高级特性。 在Spring 2.0中集成JPA,可以利用Spring的数据访问抽象层,如JdbcTemplate和...
此外,还可以使用`@NamedQuery`或`@NamedNativeQuery`来预定义查询。JPA还支持 Criteria API,用于动态构建查询。 5. **事务管理**:JPA支持事务控制,可以配合Spring框架使用声明式事务管理,简化代码中的事务处理...
开发者可以使用@NamedQuery或@NamedQuery方法定义预编译的SQL查询,提高代码的可读性和性能。 消息驱动bean(Message-Driven Beans,MDB)是EJB3中的另一个关键组件,它们负责处理JMS(Java Message Service)消息...
4. **查询操作**:EJB3提供了方便的查询API,如JPA的`@NamedQuery`或`Criteria API`,可以用来检索多对多关系的数据。例如,根据用户获取其所有角色: ```java @NamedQuery(name = "getUserRoles", query = "SELECT...
JPA允许使用`@NamedQuery`和`@NamedNativeQuery`进行预定义的查询,提高代码的可读性和性能。 在并发处理上,EJB3提供了线程安全的有状态会话bean,可以处理多个客户端请求,同时保持会话状态。而无状态会话bean则...
- Entity Bean可以使用@NamedQuery或@NamedNativeQuery进行预定义的查询,提高性能和代码可读性。 4. **一对一关系的配置**: - 配置一对一关系时,需要考虑是否设置optional属性为false,这将强制规定关系必须...
这大大简化了数据库操作,如`@NamedQuery`可以用于预定义SQL查询。 本教程可能包含以下章节: 1. **EJB3基础**:介绍EJB3的主要概念,包括实体Bean、会话Bean和消息驱动Bean的基本用法。 2. **JBoss应用服务器设置...
5. **JPA**:Java EE 6中的JPA 2.0加强了ORM能力,如 Criteria API 和 Named Query。示例可能展示了如何定义实体类,使用注解配置数据映射,以及执行CRUD操作。 6. **CDI(Contexts and Dependency Injection)**:...
- 使用预编译的`NamedQuery`或`NamedNativeQuery`提升查询效率。 - 熟悉JPA和EclipseLink的特性,如懒加载、级联操作等,以便有效利用它们。 通过上述讲解,你应该对如何在EclipseLink中进行CRUD操作有了基本的理解...
- **EJBQL/HQL**:使用`@NamedQuery`或`@NamedNativeQuery`声明预定义的查询。 - **本地化查询**:支持多语言查询语句。 4. **Hibernate独有的注解扩展** - `@Entity`、`@Id`、`@Column`等是标准的JPA注解,而`@...
- **JP-QL/HQL查询映射**:使用`@NamedQuery`注解来定义命名查询,可以在运行时调用这些查询。 - **原生SQL查询映射**:使用`@SQL`注解来定义原生SQL查询。 #### 四、Hibernate注解扩展 除了JPA标准注解外,...