栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

QueryDsl Web查询关于Map字段的键

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

QueryDsl Web查询关于Map字段的键

更换豆

实施ApplicationContextAware

这就是我在应用程序上下文中替换bean的方式。

感觉有点。我希望听到一种更好的方法。

@Configurationpublic class CustomQuerydslHandlerMethodArgumentResolverConfig implements ApplicationContextAware {        private final RepositoryRestMvcConfiguration repositoryRestMvcConfiguration;    @Autowired    public CustomQuerydslHandlerMethodArgumentResolverConfig(RepositoryRestMvcConfiguration repositoryRestMvcConfiguration) {        this.repositoryRestMvcConfiguration = repositoryRestMvcConfiguration;    }    @Override    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {        DefaultListableBeanFactory beanFactory = (DefaultListableBeanFactory) ((GenericApplicationContext) applicationContext).getBeanFactory();        beanFactory.destroySingleton(REPO_REQUEST_ARGUMENT_RESOLVER_BEAN_NAME);        beanFactory.registerSingleton(REPO_REQUEST_ARGUMENT_RESOLVER_BEAN_NAME,     meetupApiRepoRequestArgumentResolver(applicationContext, repositoryRestMvcConfiguration));    }        @Bean    public RootResourceInformationHandlerMethodArgumentResolver meetupApiRepoRequestArgumentResolver(ApplicationContext applicationContext,  RepositoryRestMvcConfiguration repositoryRestMvcConfiguration) {        QuerydslBindingsFactory factory = applicationContext.getBean(QuerydslBindingsFactory.class);        QuerydslPredicateBuilder predicateBuilder = new QuerydslPredicateBuilder(repositoryRestMvcConfiguration.defaultConversionService(),    factory.getEntityPathResolver());        return new CustomQuerydslHandlerMethodArgumentResolver(repositoryRestMvcConfiguration.repositories(),        repositoryRestMvcConfiguration.repositoryInvokerFactory(repositoryRestMvcConfiguration.defaultConversionService()),        repositoryRestMvcConfiguration.resourcemetadataHandlerMethodArgumentResolver(),        predicateBuilder, factory);    }}

从http参数创建Map-searching谓词

扩展RootResourceInformationHandlerMethodArgumentResolver

这些是基于http查询参数创建我自己的Map-search谓词的代码段。再次-很想知道更好的方法。

postProcess
方法调用:

        predicate = addCustomMapPredicates(parameterMap, predicate, domainType).getValue();

在将

predicate
引用传递到
QuerydslRepositoryInvokerAdapter
构造函数并返回之前。

这是该

addCustomMapPredicates
方法:

    private BooleanBuilder addCustomMapPredicates(MultiValueMap<String, String> parameters, Predicate predicate, Class<?> domainType) {        BooleanBuilder booleanBuilder = new BooleanBuilder();        parameters.keySet()       .stream()       .filter(s -> s.contains("[") && matches(s) && s.endsWith("]"))       .collect(Collectors.toList())       .forEach(paramKey -> {String property = paramKey.substring(0, paramKey.indexOf("["));if (ReflectionUtils.findField(domainType, property) == null) {    LOGGER.warn("Skipping predicate matching on [%s]. It is not a known field on domainType %s", property, domainType.getName());    return;}String key = paramKey.substring(paramKey.indexOf("[") + 1, paramKey.indexOf("]"));parameters.get(paramKey).forEach(value -> {    if (!StringUtils.hasLength(value)) {        booleanBuilder.or(matchesProperty(key, null));    } else {        booleanBuilder.or(matchesProperty(key, value));    }});       });        return booleanBuilder.and(predicate);    }    static boolean matches(String key) {        return PATTERN.matcher(key).matches();    }

和模式:

        private static final Pattern PATTERN = Pattern.compile(".*[^.]\[.*[^\[]");


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/410680.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号