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

多字段排序

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

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

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

List orPredicates = new ArrayList<>();
orPredicates.add(builder.equal(root.join("sysUsers", JoinType.LEFT).get("id"), normalSysUserId));
orPredicates.add(builder.equal(root.join("sysUsersOnlyRead", JoinType.LEFT).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.get("id").in(idList));

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

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

函数 find_in_set

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

 

你可能感兴趣的:(数据库相关)