hibernate--常见@Query的操作示例,操作符及操作函数

32 篇文章 5 订阅
24 篇文章 0 订阅

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。
    通常把经常使用的查询语句定义成命名查询。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值