fuint-framework/fuint-base/src/main/java/com/fuint/base/util/DynamicSpecifications.java

(开头部分) 9KB

这里只显示每个文件的开头 60 行。登录后可以解锁完整代码。

package com.fuint.base.util;

import com.fuint.util.StringUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.data.jpa.domain.Specification;
import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Join;
import javax.persistence.criteria.Path;
import javax.persistence.criteria.Predicate;
import javax.persistence.criteria.Root;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;

/**
 * 动态SQL拼接
 *
 * @author fsq
 * @version $Id: DynamicSpecifications.java
 */
public class DynamicSpecifications {

    private static final Logger logger = LoggerFactory.getLogger(DynamicSpecifications.class);

    public static <T> Specification<T> groupBySearchFilter(Root<T> root, final Collection<SearchFilter> filters,
                                                           final Class<T> entityClazz, final String groupField) {
        return new Specification<T>() {
            @SuppressWarnings({"rawtypes", "unchecked"})
            @Override
            public Predicate toPredicate(Root<T> root, CriteriaQuery<?> query,
                                         CriteriaBuilder builder) {
                if (filters != null && filters.size() > 0) {
                    List<Predicate> predicates = new ArrayList<Predicate>();
                    for (SearchFilter filter : filters) {
                        Path expression = null;
                        if (StringUtil.split(filter.fieldName, ".").length <= 1) {//如果是单属性查询
                            expression = root.get(filter.fieldName);
                        } else {
                            try {
                                String[] fieldName = StringUtil.split(filter.fieldName, ".");
                                if (fieldName.length > 3) {
                                    logger.error("关联对象属性查询,filter设置关联不能超过三层");
                                    continue;
                                }
                                Join join = null;
                                for (int i = 0; i < fieldName.length - 1; i++) {
                                    if (null != join) {
                                        join = join.join(fieldName[i]);
                                    } else {
                                        join = root.join(fieldName[i]);
                                    }
                                }
                                if (null != join) {
                                    expression = join.get(fieldName[fieldName.length - 1]);
                                }
                            } catch (Exception e) {
                                logger.error("关联对象属性查询,filter设置错误:{}", e);
                                continue;
后面还有 135 行代码,购买后查看完整代码

24 小时内免费解锁 3 个项目,之后 1 算力/个。 规则说明

AI 解读 AI

登录后可用,每次 10 算力,解读结果公开显示在下面。

还没有人解读过这个文件。