JPA(order, or, like, left join, 时间筛选,when case,find_in_set )

多字段排序

List<Order> orders=new ArrayList<>();
            orders.add(builder.asc(root.join("provider").<String> get("providerCode")));
            orders.add(builder.asc(root.<String> get("country")));
            query.orderBy(orders);

现根据providerCode,然后按照国家排序,其中,provider是别的表中的字段映射的对象

or的用法(其中用了left join)

List<Predicate> orPredicates = new ArrayList<>();
orPredicates.add(builder.equal(root.join("sysUsers", JoinType.LEFT).<Long>get("id"), normalSysUserId));
orPredicates.add(builder.equal(root.join("sysUsersOnlyRead", JoinType.LEFT).<Long>get("id"), normalSysUserId));
predicates.add(builder.or(orPredicates.toArray(new Predicate[orPredicates.size()])));

JoinType.LEFT  如果不加的话 ,  默认是 Inner join.

时间的筛选


Instant startInstant = DateUtils.convertStringToStartInstant(applyStartDate);
predicates.add(builder.greaterThanOrEqualTo(root.join("cpBusiness").get("applyTime"), startInstant));
Instant endInstant = DateUtils.convertStringToEndInstant(applyEndDate);
predicates.add(builder.lessThanOrEqualTo(root.join("cpBusiness").get("applyTime"), endInstant));

like的用法

predicates.add(builder.like(root.get("email"), "%" + searchText + "%"));

in的用法

predicates.add(root.<Long>get("id").in(idList));

自定义排序(other结尾的排在前面,其他的按照number排序)

List<Order> orders = new ArrayList<>();
orders.add(buuilder.asc(
    builder.selectCase()
        .when(builder.like(root.get("number"),"%OTHER"), 1)
        .otherwise(2)));
orders.add(builder.asc(root.<String>get("number")));
query.orderBy(orders);

函数 find_in_set

List<Predicate> predicateList = new ArrayList<>();
if (StringUtils.isNotBlank(userId)) {
    //返回参数在数据库中该字段的位置
    Expression<Integer> findInSetFun = cb.function("FIND_IN_SET", Integer.class,             
        builder.literal(userId), root.get("manager"));
    //设置条件 只要返回值 >0 则说明该参数存在于目标字符串中
    predicateList .add(cb.greaterThan(findInSetFun, 0));
}

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值