多字段排序
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));
}