1. 操作示例
@Query(value = "SELECT u.serviceId FROM AlgrthmServiceMap u WHERE u.algrthmType=:algrthmType")
String findServiceId(@Param("algrthmType") String algrthmType);
/**
* 查询全部
*/
@Query("select t from AlgrthmServiceMap t")
List<AlgrthmServiceMap> find();
/**
* 查询全部
*/
@Query("select t from AlgrthmServiceMap t WHERE t.serviceId = 'nil'")
List<AlgrthmServiceMap> getAlgrthmMapList();
/**
* 查询全部
*/
@Query("select t from AlgrthmServiceMap t WHERE t.serviceId = 'nil'")
List<AlgrthmServiceMap> getAlgrthmMapList();
/**
* 分页查询功能
*/
@Query("SELECT c FROM UserPri c where c.name=?1")
public List<UserPri> findUserPriByPage(String certNum, Pageable pageable);
/**
* 批量update -- in -- 入参: Iterable<T>
*/
@Transactional
@Modifying
@Query("update UserPri u set u.money=?1 where u.name in(?2)")
int batchUpdate(int money, List<String> nameList);
2.使用操作符
# NOT操作符
# 查询id不是1036的所有人
select p from Person p where not(p.id = 1036)
# BETWEEN操作符
# 查询年龄在20到26的所有人;上限和下限必须是相同的数据类型
select p from Person p where p.age between 20 and 26
# IS NULL操作符
# 查询名字不为NULL的所有人
select p from Person p where p.name is not null
# IS EMPTY操作符
IS EMPTY是针对集合属性(Collection)的操作符。
可以和NOT 一起使用。注:低版权的MySQL 不支持IS EMPTY
# 查询兴趣(是集合)是空的所有人
select p from Person p where p.interest is empty
# IN 操作符
# 查询id是101和102的人
select p from Person p where p.id in (101,102)
# EXISTS 操作符
[NOT]EXISTS 需要和子查询配合使用。注:低版权的Mysql 不支持EXISTS
# 如果书籍名字中包含有EJB字样,则得到所有人
select p from Person p where exists (select b from Book b where b.name like ‘%EJB%’ )
# MEMBER OF操作符
可以使用MEMBER OF操作符检查集合-值路径表达式中是否存在标识符变量、单一值表达式或是输入参数。
# 查询兴趣(是集合)是中包含所输入的兴趣实体实例(:interest)的所有人
select p from Person p where :interest member of p.interest
3. 使用字符串函数
JPQL定义了内置函数方便使用。这些函数的使用方法和SQL中相应的函数方法类似。包括:
1. CONCAT 字符串拼接
2. SUBSTRING 字符串截取
3. TRIM 去掉空格
4. LOWER 转换成小写
5. UPPER 装换成大写
6. LENGTH 字符串长度
7. LOCATE 字符串定位
使用算术函数
JPQL仅仅支持了最低限度的算术函数集合,可以在JPQL的where和having子句中使用算术函数。JPQL定义的算术函数包括:
ABS 绝对值
SQRT 平方根
MOD 取余数
SIZE 取集合的数量
使用时间函数
JPQL像大多数语言一样提供了获得当前日期、时间或是时间标记的函数。
这些函数转换为数据库专有的SQL函数,从数据库检索当前日期、时间或时间标记。
包含的时间函数如下:
CURRENT_DATE 返回当前日期
CURRENT_TIME 返回当前时间
CURRENT_TIMESTAMP 返回当前时间标记
联结(连接/关联)
JPQL仍然支持和SQL中类似的关联语法:
left out join/left join
left out join/left join等,都是允许符合条件的右边表达式中的Entities 为空
(需要显式使用left join/left outer join 的情况会比较少。)
inner join
inner join 要求右边的表达式必须返回Entities。
left join fetch/inner join fetch
在默认的查询中,Entity中的集合属性默认不会被关联,集合属性默认是延迟加载( lazy-load )。
那么,left fetch/left out fetch/inner join fetch提供了一种灵活的查询加载方式来提高查询的性能(集合属性被关联,
同Entity同时加载而不是在需要时再加载,这样就转换为SQL语句时为一条SQL语句,
而不是加载Entity时一条语句,加载集合属性时有N(等于Entity数量)条语句,避免了N+1问题,提高了查询性能)。
使用聚合函数
JPQL提供的聚合函数有AVG、COUNT、MAX、MIN、SUM。在AVG、MAX、MIN、SUM函数中只能使用持久化字段,
而在COUNT中可以使用任何类型的路径表达式或标识符。
COUNT返回的类型是Long,AVG是Double,SUM可能返回Long或Double。
分组
如果聚合函数不是select...from的唯一一个返回列,需要使用"GROUP BY"语句。"GROUP BY"应该包含select 语句中除了聚合函数外的所有属性。如果还需要加上查询条件,需要使用"HAVING"条件语句而不是"WHERE"语句
# 返回年龄大于20的各年级的总人数(人数大于120)
select p.grade, count(p) from Person p where p.age > 20 group by p.grade having count(*)>120
排序
在JPQL中像SQL一样使用order by 来进行排序。"ASC"和"DESC"分别为升序和降序,JPQL中默认为ASC升序。
批删除和批更新
JPQL支持批量删除和批量更新的操作。
和查询相同的是也是要使用EntityManager.createQuery方法来创建一个Query实例,
不同的是在这里要使用Query.executeUpdate方法来直行删除和更新,该方法返回的值是操作的记录数。
命名查询
可以在实体bean上通过@NamedQuery or @NamedQueries预先定义一个或多个查询语句,
减少每次因书写错误而引起的BUG。
通常把经常使用的查询语句定义成命名查询。