php gt lte gte,springdata jpa封装数据库关键字(EQ, LIKE, GT, LT, GTE, LTE,IN)

数据库关键字申明,类SearchFilter:

/*******************************************************************************

* Copyright (c) 2005, 2014 springside.github.io

*

* Licensed under the Apache License, Version 2.0 (the "License");

*******************************************************************************/

package com.clearpro.common.modules.persistence;

import java.util.Map;

import java.util.Map.Entry;

import org.apache.commons.lang3.StringUtils;

import com.google.common.collect.Maps;

public class SearchFilter {

public enum Operator {

EQ, LIKE, GT, LT, GTE, LTE,IN

}

public String fieldName;

public Object value;

public Operator operator;

public SearchFilter(String fieldName, Operator operator, Object value) {

this.fieldName = fieldName;

this.value = value;

this.operator = operator;

}

/**

* searchParams中key的格式为OPERATOR_FIELDNAME

*/

public static Mapparse(MapsearchParams) {

Mapfilters = Maps.newHashMap();

for (Entryentry : searchParams.entrySet()) {

// 过滤掉空值

String key = entry.getKey();

Object value = entry.getValue();

/*if (StringUtils.isBlank((String) value)) {

continue;

}*/

// 拆分operator与filedAttribute

String[] names = StringUtils.split(key, "_");

if (names.length != 2) {

throw new IllegalArgumentException(key + " is not a valid search filter name");

}

String filedName = names[1];

Operator operator = Operator.valueOf(names[0]);

// 创建searchFilter

SearchFilter filter = new SearchFilter(filedName, operator, value);

filters.put(key, filter);

}

return filters;

}

}关键字匹配的sql处理,类DynamicSpecifications:

/*******************************************************************************

* Copyright (c) 2005, 2014 springside.github.io

*

* Licensed under the Apache License, Version 2.0 (the "License");

*******************************************************************************/

package com.clearpro.common.modules.persistence;

import java.util.Collection;

import java.util.List;

import javax.persistence.criteria.CriteriaBuilder;

import javax.persistence.criteria.CriteriaQuery;

import javax.persistence.criteria.Path;

import javax.persistence.criteria.Predicate;

import javax.persistence.criteria.Root;

import org.apache.commons.lang3.StringUtils;

import org.springframework.data.jpa.domain.Specification;

import com.clearpro.common.modules.utils.Collections3;

import com.google.common.collect.Lists;

public class DynamicSpecifications {

public static SpecificationbySearchFilter(final Collectionfilters, final ClassentityClazz) {

return new Specification() {

@Override

public Predicate toPredicate(Rootroot, CriteriaQuery> query, CriteriaBuilder builder) {

if (Collections3.isNotEmpty(filters)) {

Listpredicates = Lists.newArrayList();

for (SearchFilter filter : filters) {

// nested path translate, 如Task的名为"user.name"的filedName, 转换为Task.user.name属性

String[] names = StringUtils.split(filter.fieldName, ".");

Path expression = root.get(names[0]);

for (int i = 1; i < names.length; i++) {

expression = expression.get(names[i]);

}

// logic operator

switch (filter.operator) {

case EQ:

predicates.add(builder.equal(expression, filter.value));

break;

case LIKE:

predicates.add(builder.like(expression, "%" + filter.value + "%"));

break;

case GT:

predicates.add(builder.greaterThan(expression, (Comparable) filter.value));

break;

case LT:

predicates.add(builder.lessThan(expression, (Comparable) filter.value));

break;

case GTE:

predicates.add(builder.greaterThanOrEqualTo(expression, (Comparable) filter.value));

break;

case LTE:

predicates.add(builder.lessThanOrEqualTo(expression, (Comparable) filter.value));

break;

case IN:

predicates.add(expression.in(filter.value));

break;

}

}

// 将所有条件用 and 联合起来

if (!predicates.isEmpty()) {

return builder.and(predicates.toArray(new Predicate[predicates.size()]));

}

}

return builder.conjunction();

}

};

}

}

注意:IN 关键字的处理与其他不同

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值