JPQL查询和SQL语言的学习笔记
一. JPQL
1. 什么是JPQL?
在 Java EE 中,JPQL就是一种查询语言,具有与SQL 相类似的特征,JPQL是完全面向对象的,具备继承、多态和关联等特性,和hibernate的HQL很相似。
JPQL( Java 持久性查询语言)是专门为Java 应用程序访问和导航实体实例设计的。JPQL是EJB2使用的查询语言EJB QL的扩展,它继承了EJB QL并对其做了
一些改变。
2. 使用
JPQL 语句支持两种方式的参数定义方式 : 命名参数和位置参数 。在同一个查询语句中只允许使用一种参数定义方式。
JPQL语言的语句可以是 select 语句、update 语句或delete语句,它们都通过 Query 接口封装执行。
Query接口封装了执行数据库查询的相关方法。调用 EntityManager 的 createQuery、create NamedQuery 及 createNativeQuery 方法可以获得查询对象,进
而可调用 Query 接口的相关方法来执行查询操作。
步骤如下:
要从 Java 代码内发出 JPQL 查询,您需要利用 EntityManager API 和 Query API 的相应方法,执行以下一般步骤:
1. 使用注入或通过 EntityManagerFactory 实例获取一个 EntityManager 实例。
2. 通过调用相应 EntityManager 的方法(如 createQuery),创建一个 Query 实例。
3. 如果有查询参数,使用相应 Query 的 setParameter 方法进行设置。
4. 如果需要,使用 setMaxResults 和/或 setFirstResult Query 的方法设置要检索的实例的最大数量和/或指定检索的起始实例位置。
5. 如果需要,使用 setHint Query 的方法设置供应商特定的提示。
6. 如果需要,使用 setFlushMode Query 的方法设置查询执行的刷新模式,覆盖实体管理器的刷新模式。
7. 使用相应 Query 的方法 getSingleResult 或 getResultList 执行查询。如果进行更新或删除操作,您必须使用 executeUpdate 方法,它返回已更新或删除的实体实例的数量。
JPQL的查询可以分为命名查询和动态查询。
动态查询
可以使用EntityManager.createQuery方法创建动态查询,唯一的要求是把合法的JPQL语句传递给此方法。如下:
Query query = em.createQuery(“select p from Person p where p.id=1033”);
其中where语句可是可选的。在这里JPQL看上去和SQL语句很像,但应当注意到的是from后边的Person是实体Bean而不是数据表。
在所写的JPQL语句中你可以像示例中那样的直接将查询条件写在语句中。但是还有更好的方法。在这里你可以使用设置查询参数的方式,其中又有位置参数和命名参数的分别。
使用位置参数如下所示:
Query query = em.createQuery(“select p from Person p where p.id=?1”);
Query.setParameter(1, 1033);//第一个参数是位置,第二个参数查询条件
使用命名参数如下所示:
Query query = em.createQuery(“select p from Person p where p.id=:id”);
Query.setParameter(“id”, 1033);//第一个参数是参数名称,第二个参数查询条件
需要注意的是位置参数的是位置前加符号”?”,命名参数是名称前是加符号”:”。
二. SQL
1. 什么是SQL?
结构化查询语言是高级的非过程化编程语言,允许用户在高层数据结构求用户指定对数据的存放方法,也不需要用户了解具体的数据存放方式,所以具有完全不同底层结构的不同数据库系统, 可以使用相同的结构化查询语言作为数据输入与管理的接口。结构化查询语言语句可以嵌套,这使它具有极大的灵活性和强大的功能。
2. 构成
结构化查询语言包含6个部分: