test

import org.springframework.web.bind.annotation.*;
import org.springframework.beans.factory.annotation.Autowired;
import java.util.List;

@RestController
@RequestMapping("/api/person")
public class PersonController {

    @Autowired
    private PersonService personService;

    @GetMapping("/search")
    public List<YourEntityClass> search(
            @RequestParam String keyword,
            @RequestParam String value) {

        // 调用 Service 查询方法
        return personService.searchByKeyword(keyword, value);
    }
}

import org.springframework.stereotype.Service;
import java.util.List;

@Service
public class PersonService {

    @Autowired
    private YourEntityClassMapper yourEsMapper;

    private final QueryStrategyFactory<YourEntityClass> strategyFactory = new QueryStrategyFactory<>();

    public List<YourEntityClass> searchByKeyword(String keyword, String value) {
        EsQueryBuilder<YourEntityClass> builder = new EsQueryBuilder<>(YourEntityClass.class);

        // 获取通用查询策略
        QueryStrategy<YourEntityClass> strategy = strategyFactory.getStrategy(keyword);

        // 应用策略
        strategy.apply(builder.getQueryWrapper(), value);

        // 执行查询
        return yourEsMapper.selectList(builder.build());
    }
}


import com.xpc.easyes.core.conditions.LambdaEsQueryWrapper;

public class FieldQueryStrategy<T> implements QueryStrategy<T> {
    private final String field;

    public FieldQueryStrategy(String field) {
        this.field = field;
    }

    @Override
    public void apply(LambdaEsQueryWrapper<T> queryWrapper, String value) {
        if (field.contains(".")) {
            // 如果字段是嵌套字段,例如 "list.name"
            String[] parts = field.split("\\.");
            String nestedPath = parts[0];
            String nestedField = parts[1];
            queryWrapper.nested(nestedPath, w -> w.eq(nestedPath + "." + nestedField, value));
        } else {
            // 普通字段查询
            queryWrapper.eq(field, value);
        }
    }
}

import java.util.HashMap;
import java.util.Map;

public class QueryStrategyFactory<T> {

    private final Map<String, QueryStrategy<T>> strategies = new HashMap<>();

    public QueryStrategyFactory() {
        // 注册字段对应的通用策略
        registerField("name");
        registerField("list.name");
        // 可以在此添加其他字段
    }

    private void registerField(String field) {
        strategies.put(field, new FieldQueryStrategy<>(field));
    }

    public QueryStrategy<T> getStrategy(String keyword) {
        QueryStrategy<T> strategy = strategies.get(keyword);
        if (strategy == null) {
            throw new IllegalArgumentException("Invalid keyword: " + keyword);
        }
        return strategy;
    }
}

import com.xpc.easyes.core.conditions.LambdaEsQueryWrapper;
import com.xpc.easyes.core.core.EsWrappers;

public class EsQueryBuilder<T> {

    private final LambdaEsQueryWrapper<T> queryWrapper;

    public EsQueryBuilder(Class<T> clazz) {
        this.queryWrapper = EsWrappers.lambdaQuery(clazz);
    }

    public LambdaEsQueryWrapper<T> getQueryWrapper() {
        return queryWrapper;
    }

    public LambdaEsQueryWrapper<T> build() {
        return queryWrapper;
    }
}


import com.xpc.easyes.core.conditions.LambdaEsQueryWrapper;

public interface QueryStrategy<T> {
    void apply(LambdaEsQueryWrapper<T> queryWrapper, String value);
}

  

posted @ 2024-11-05 21:31  findlisa  阅读(4)  评论(0编辑  收藏  举报