JPA--JPQL(五),jpa--jpql
分享于 点击 42611 次 点评:93
JPA--JPQL(五),jpa--jpql
Java Persistence Query Language(Java持久化查询语言) 一、JPQL定义 # JPQL是一种可移植的查询语言,可以被编译成所有主流数据库服务器上的SQL # JPQL是面向对象的,通过面向对象而非面向数据库的查询语言查询数据,在Java空间对类和对象进行操作,避免程序的SQL语句紧密耦合# 使用javax.persistence.Query接口代表一个查询实例
二、创建JPQL实例 JPQL通过EntityManager来生成Query实例:EntityManager提供使用JPQL(或原生SQL)创建Query的方法:
【方法】 【用途】
public Query createQuery(String sqlString); 使用JPQL语句创建动态查询 public Query createNamedQuery(String name); 在命名查询的基础上创建查询实例,此方法可以用于JPQL和原生SQL查询
public Query createNativeQuery(String sqlString); 使用包含UPDATE或DELETE等等原生SQL语句创建动态查询
public Query createNativeQuery(String sqlString, Class result-class); 使用原生SQL语句创建检索单一实体类型的动态查询
public Query createNativeQuery(String sqlString, String result-setMapping); 使用原生SQL语句创建检索多个实体结果集合的动态查询
三、Query接口执行数据查询的部分方法: # getSingleResult():单一查询结果
# getResultList():多个查询结果
# setParameter:
Query setParameter(int position, Object value):通过参数位置号绑定查询语句中的参数
Query setParameter(String name, Object value):绑定命名参数
# setMaxResults:设置返回的最大结果数
# executeUpdate:新增、删除或者更改的语句,通过该方法执行
【返回单一查询结果的程序代码】 @Test
public void findPerson() throws Exception{ javax.persistence.EntityManager em = emf.createEntityManager();
Person p = (Person)em.createQuery("select p from Person p where p.name = :name") // 类似HQL
.setParameter("name", "创")
.getSingleResult(); // 设定查询的参数值
assertEquals(p.getName(), "创");
assertEquals(p.getSurname, "伟");
}
......
【返回多个查询结果的程序代码】
@Test
public void findPersons() throws Exception{ javax.persistence.EntityManager em = emf.createEntityManager();
List<Person> p = (List<Person>)em.createQuery("select p from Person p where not(p.name = : name)")
.setParameter("name", "创") // 设定查询的参数值
.getResultList(); // 返回查询结果列表
assertEquals(p.size(), 2);
assertEquals(p.get(0), getName(), "伟");
assertEquals(p.get(1), getName(), "黄");
}
四、JPQL支持三种语句类型,可以在查询中使用JPQL执行选择、更新、删除操作: 【语句类型】 【描述】
SELECT 检索实体或与实体有关的数据
UPDATE 更新一个或多个实体 DELETE 删除一个或多个实体
五、定义和使用Select: SELECT c FROM Category c WHERE c.categoryName LIKE :categoryName ORDER BY c.categoryId; 该JPQL查询具有如下内容:
SELECT子句:指定要检索的对象类型、实体或值;
FROM子句:指定其它子句是使用的实体声明;
可选的WHERE,过滤查询返回的结果;
可选的ORDER BY子句,排序查询检索到的结果;
可选的GROUP BY子句,执行聚合;
可选的HAVING子句,执行与聚合结合的过滤。
六、JPQL条件表达式和操作 【操作符类型】 【操作符】
定 位 .
一元符号 +、-
算 术 *、/、+、-
关 系 =、>、>=、<、<=、<>、
[NOT] BETWEEN、[NOT] LIKE、[NOT] IN
IS [NOT] NULL、IS [NOT] EMPTY、[NOT] MEMBER OF 逻 辑 NOT AND OR 七、字符串函数 字符串函数可以在JPQL查询的SELECT子句中使用,这些函数的唯一用途是过滤查询结果。 如果希望对数据执行任何字符串操作,就必须使用Java语言中可用的函数。主要原因在于应用程序在内存中维护字符串比在数据库中进行同样操作要快很多。
# CONCAT(string 1, string 2):返回两个字符串或字面量连接后的值
# SUBSTRING(string, position, length):返回从position开始长度为length的子字符串
# LOWER(string):将一个字符串string转换成小写形式
# UPPER(string):将一个字符串string转换成大写形式
# LENGTH(string):返回字符串string的长度,为整数 # TRIM( [ [ LEADING | TRAILING | BOTH ] [ trim_character ] FROM ] string_to_trimmed):剪切特定字符,得到新字符串。剪切方式可以是LEADING、TRAILING 或[ BOTH ]。如果没有指定trim_character,则剪切空白
# LOCATE(searchString, stringToBeSearched [ initialPosition ] ):返回给定字符串在另一个字符串中的位置。如果没有指定initialPosition,则从position 1 开始检索
八、算术函数 【算术函数】 【描述】
ABS(simple_arithmetic_expression) 返回绝对值
SORT(simple_arithmetic_expression) 返回平方根的双精度值
MOD(num,div) 返回对怒目、div执行取模操作的结果
SIZE(collection value path expression) 返回集合中项目的数量
九、时间函数 【时间函数】 【描述】
CURRENT_DATE 返回当前日期
CURRENT_TIME 返回当前时间
CURRENT_TIMESTAMP 返回当前时间标记
十、JPQL投影:在SELECT子句中使用构造器表达式 可以在SELECT子句中使用构造器返回一个或多个饭Java实例。当你希望从子查询中检索到的数据初始化的查询中创建实例时,这一特性特别有用:
SELECT NEW actionbazaar.persistence.ItemReport(c.categoryID, c.createdBy) FROM Category c 指定的类不必映射到数据库,也不必是实体。 【使用聚合】:
# 聚合函数:AVG、COUNT、MAX、MIN 和 SUM
# 通过GROUP BY 和 HAVING 分组
【排序】:ORDER BY
【使用子查询】: # 可以在WHERE 和HAVING 子句中使用子查询,EJB3.1的FROM子句中不支持;
# 可以在子查询中使用IN、EXISTS、ALL、ANY 和 SOME
【连接实体】:
# 关联联结:INNER JOIN
# 外联结:LEFT JOIN 或 LEFT OUTER JOIN
# 获取联结:JOIN FETCH
十二、JPQL--Update 和 Delete 大数据量的更新、删除,可以用EntityManager进行实体的更新操作,也可以通过查询语言执行数据表的字段更新,记录删除的操作
# UPDATE PollOption p SET p.optionItem = :value WHERE p.optionId = :optionId
# DELETE FROM PollOption p WHERE p.optionId = :optioned
相关文章
- 暂无相关文章
用户点评