JPA持久化API,针对数据库的增删改查(五):JPA的查询支持;查询API简介;使用Query创建查询

JPA的查询支持
JPA定义了一套属于面向对象的查询语言:Java Presistence Query Language(JPQL)通过使用JPQL,
	开发者可以编写具有良好移植性的查询,这种JPQL查询可以在多种数据库上运行良好。
	
JPQL就是JPA规范的重要组成部分,从表面上看,JPQL语法有点类似于SQL语法,但JPQL与SQL具有本质的区别:
	JPQL是面向对象的查询语言,因此它完全可以理解继承,多态和关联等特征。而且JPQL内置了大量函数,
	极大地方便了JPQL查询的功能。当然JPQL底层依然是基于SQL的,但JPQL到SQL的转换无需开发者关心,
	JPQL解析器会负责完成这种转换,并负责执行这种转化的SQL语句来更新数据库。
	
JPA提供了一套功能非常强大的查询体系,它不仅可以使用JPA本身定义的JPQL语句进行查询,
	还可以利用原生SQL语句进行查询,通过使用EntityManager的createNativeQuery即可以原生SQL语句进行查询。
	这样就可以让开发者灵活地利用底层数据库的特性进行查询
1.查询API
JPQL查询被设计的非常简单,开发者能以完全面向对象的方式来进行查询,而且步骤非常简单,
	甚至比大家熟悉的SQL查询更加简单
	
1.1面向对象的JPQL
	从语法相似性的角度来说,JPQL与传统的SQL有点类似,这种类似也有一个好处:开发者无需重新学习一门复杂的语言:开发者可以直接把已有的SQL经验应用到JPQL查询上。
	但SQL与JPQL最大的区别在于,SQL是面向关系数据库的查询语言,因此SQL操作的对象是数据表,数据列;而JPQL操作的对象是实体对象,实体属性
eg:
	@Test
	public void testQuery() {
		
		try {
			EntityManager em = emf.createEntityManager();
			//SQL:select empno,ename,job from emp 
				//empno,ename,job 字段名  emp表名
			//JPQL: select empno,ename,job from Emp 
				//empno,ename,job 属性名 Emp 类名
			em.getTransaction().begin();
			//定义一个查询对象 ?1第一个动态参数
			Query query = em.createQuery("select e.empno,e.ename,e.job from Emp as e where e.empno = ?1");
			//Query query = em.createQuery("select e.empno,e.ename,e.job,e.hiredate from Emp as e where e.empno = :empno");
			
			//设置动态参数内容 设置多个动态参数
			query.setParameter(1, 8);
			//query.setParameter("empno", 8);
			//执行查询
			List result = query.getResultList();
			System.out.println(result);
			//遍历查询结果
			for(int i = 0; i<result.size(); i++) {
				Object[] row = (Object[]) result.get(i);
				for(int j = 0; j<row.length; j++) {
					System.out.print(row[j]+" ");
				}
				System.out.println();
			}
		
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	
	}

语法格式:
	select 实体别名.属性名, 实体别名.属性名,……
	from 实体名[as]实体别名
	where实体别名.实体属性
2.查询API简介
JPQL查询被设计的非常简单,它主要由Query接口来完成各种查询,Query接口就是JPQL的核心API。
	Query是由EntityManager创建出来的,EntityManager提供了如下方法来创建Query。
		1.Query createNamedQuery(String name):创建查询的名称来创建一个命名查询。这个命名查询即有可能是用JPQL定义的,也可能是用SQL定义的
		2.Query createNativeQuery(String sqlString):根据原生SQL语句来创建一个查询
		3.Query createNativeQuery(String sqlString,Class resultClass):根据原生SQL语句来创建一个查询
		4.Query createNativeQuery(String sqlString,String resultSetMapping):根据原生SQL语句来创建一个查询。其中resultSetMapping用于对结果集进行自定义映射
		5.Query createQuery(String jpqlString):根据指定的JPQL语句来创建一个查询。
JPQL查询语句中即可以使用问号(?N,其中N代表位置索引)作为索引参数,也可以使用命名参数,
	而Query则提供了如下方法来为JPQL语句中参数设置参数值
3.使用Query 创建查询
执行查询之前先要准备JPQL查询语句

eg:

	@Test
	public void testQuery() {
		
		try {
			EntityManager em = emf.createEntityManager();
			//SQL:select empno,ename,job from emp //empno,ename,job字段名  emp表名
			//JPQL: select empno,ename,job from Emp //empno,ename,job 属性名 Emp 类名
			em.getTransaction().begin();
			//定义一个查询对象 ?1第一个动态参数
			Query query = em.createQuery("select e.empno,e.ename,e.job from Emp as e where e.empno = ?1");
			//Query query = em.createQuery("select e.empno,e.ename,e.job,e.hiredate from Emp as e where e.empno = :empno");
			
			//设置动态参数内容 query.setParameter(1, 8).setParameter(arg0, arg1);设置多个动态参数
			query.setParameter(1, 8);
			//query.setParameter("empno", 8);
			//执行查询 查询出对象
			List result = query.getResultList();
			System.out.println(result);
			//遍历查询结果
			for(int i = 0; i<result.size(); i++) {
				Object[] row = (Object[]) result.get(i);
				for(int j = 0; j<row.length; j++) {
					System.out.print(row[j]+" ");
				}
				System.out.println();
			}
		
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	
	}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值