首页 > 解决方案 > CriteriaQuery order by FIND_IN_SET

问题描述

我正在使用 JPA 规范查询,我们遵循以下通用架构进行查询

@Override
    public Predicate toPredicate(Root<T> root, CriteriaQuery<?> query, CriteriaBuilder builder) {

        // Create a new predicate list
        List<Predicate> predicates = new ArrayList<>();

        // Add criteria to predicates
        for (SearchCriteria criteria : list) {

            switch (criteria.getOperation()) {
            
            case EQUAL:
                predicates.add((Objects.isNull(criteria.getJoinMap()) || criteria.getJoinMap().isEmpty())
                        ? builder.equal(root.get(criteria.getKey()), criteria.getValue())
                        : builder.equal(getOrCreateJoins(root, criteria.getJoinMap()).get(criteria.getKey()),
                                criteria.getValue()));
                break;
            case MATCH:
                predicates.add((Objects.isNull(criteria.getJoinMap()) || criteria.getJoinMap().isEmpty())
                        ? builder.like(builder.lower(root.get(criteria.getKey())),
                                "%" + criteria.getValue().toString().toLowerCase() + "%")
                        : builder.like(
                                builder.lower(getOrCreateJoins(root, criteria.getJoinMap()).get(criteria.getKey())),
                                "%" + criteria.getValue().toString().toLowerCase() + "%"));

                break;
            
            
            case SORT_ASC:
                query.orderBy((Objects.isNull(criteria.getJoinMap()) || criteria.getJoinMap().isEmpty())
                        ? builder.asc(root.get(criteria.getKey()))
                        : builder.asc(getOrCreateJoins(root, criteria.getJoinMap()).get(criteria.getKey())));
                break;
            case SORT_DESC:
                query.orderBy((Objects.isNull(criteria.getJoinMap()) || criteria.getJoinMap().isEmpty())
                        ? builder.desc(root.get(criteria.getKey()))
                        : builder.desc(getOrCreateJoins(root, criteria.getJoinMap()).get(criteria.getKey())));
            default:
                break;
            }
        }

        return isSearchOperationOr ? builder.or(predicates.toArray(new Predicate[0]))
                : builder.and(predicates.toArray(new Predicate[0]));
    }

在此,我们有正在处理的键和值/值,但我希望在获取结果时,我在 IN Query 中提供的 Id 的顺序是相同的。

已经通过了 mysql 中的 FIND_IN_SET 术语,但知道如何在上面的代码中进行配置吗?

标签: mysqljpaspring-data-jpacriteria-api

解决方案


推荐阅读