【问题标题】:Spring Data Solr - @Query parameters "?10"Spring Data Solr - @Query 参数“?10”
【发布时间】:2016-04-04 08:02:25
【问题描述】:

您好,我有以下查询,但 spring data solr 正在为最后一个参数输入参数 1 值而不是参数 10 值:“AND days_ss:(?10)”... 我猜它看到的是 ?1 而不是? 10

无论如何,我尝试使用 :days 就像使用 JPA 一样,但这会干扰 lucene 语法

    @Highlight(prefix = "<b>", postfix = "</b>")
    @Query("""text:(?0) AND moduleLevel_s:(?1) AND programOfStudy_s:\"?2\" AND yearOfEntry_i:?3 AND yearOfStudy_i:?4 AND unitValue_d:?5 AND
department_s:(?6) AND teachers_ss:(?7) AND cappedAccess_b:?8 AND terms_ss:(?9) AND days_ss:(?10)""")
    HighlightPage<CourseGuide> advancedSearch(@Param(value = "query") List<String> query,
                                     @Param(value = "moduleLevel") List<ModuleLevel> moduleLevel,
                                     @Param(value = "programOfStudy") String programOfStudy,
                                     @Param(value = "yearOfEntry") def yearOfEntry,
                                     @Param(value = "yearOfStudy") def yearOfStudy,
                                     @Param(value = "unitValue") def unitValue,
                                     @Param(value = "department") List<String> department,
                                     @Param(value = "teachers") List<String> teachers,
                                     @Param(value = "cappedAccess") def cappedAccess,
                                     @Param(value = "terms") List<String> terms,
                                     @Param(value = "days") List<String> days,Pageable pageable)

实际上发生的事情是,在它的参数替换过程中,它在字符串中寻找所有出现的 '?1' 并错误地弄乱了我的 ?10 占位符。如果它在另一个方向上工作,事情可能会没问题,即先处理 ?10 然后处理 ?9,然后处理 ?8 等等

【问题讨论】:

    标签: lucene spring-data spring-data-solr


    【解决方案1】:

    我也有同样的问题。 我在 Spring-data-solr 上为这个问题创建了一个 Jira,https://jira.spring.io/browse/DATASOLR-296?jql=text%20~%20%22%40Query%22%20ORDER%20BY%20created%20DESC

    但我找到了解决办法。

    您需要使用 solrTemplate。

    示例:

    在你的 solrConfiguration.java 中

    @Configuration
    @EnableSolrRepositories(value = "com.project.repository.solr",     multicoreSupport = true)
    public class SolrConfiguration implements EnvironmentAware{
    
        private RelaxedPropertyResolver propertyResolver;
        private Environment             environment;
    
        @Override
        public void setEnvironment(Environment environment) {
            this.environment = environment;
            this.propertyResolver = new RelaxedPropertyResolver(environment, "spring.data.solr.");
        }
    
        @Bean
        public SolrServer solrServer() {
            String solrHost = propertyResolver.getProperty("host");
            return new HttpSolrServer(solrHost);
        }
    
        @Bean(name = "testSolrTemplate")
        public SolrOperations testSolrTemplate() {
            HttpSolrServer httpSolrServer = new HttpSolrServer(propertyResolver.getProperty("host"));
            return new SolrTemplate(httpSolrServer, "TestCore");
        }
    } 
    

    然后在你的 TestRepository.java 中

    public interface TestRepository extends TestRepositoryCustom, SolrRepository<Test, String>, SolrCrudRepository<Test, String> {
    }
    

    然后在你的 TestRepositoryCustom.java 中

    interface TestRepositoryCustom {
        public ArrayList<Test> findTests(
            String arg1, String arg2, String arg3, String arg4, String arg5, String arg6, String arg7, String arg8, String arg9, String arg10, String arg11
        );
    }
    

    然后在你的 TestRepositoryImpl.java 中

    public class TestRepositoryImpl implements TestRepositoryCustom {
        @Resource
        private SolrTemplate testSolrTemplate;
    
        @Override
        public ArrayList<Test> findTests(
            String arg1, String arg2, String arg3, String arg4, String arg5, String arg6, String arg7, String arg8, String arg9, String arg10, String arg11
        ) {
            Criteria criteria = new Criteria(Criteria.WILDCARD).expression(Criteria.WILDCARD)
                    .and(new Criteria("arg1").expression(arg1))
                    .and(new Criteria("arg2").expression(arg2))
                    .and(new Criteria("arg3").expression(arg3))
                    .and(new Criteria("arg4").expression(arg4))
                    .and(new Criteria("arg5").expression(arg5))
                    .and(new Criteria("arg6").expression(arg6))
                    .and(new Criteria("arg7").expression(arg7))
                    .and(new Criteria("arg8").expression(arg8))
                    .and(new Criteria("arg9").expression(arg9))
                    .and(new Criteria("arg10").expression(arg10))
                    .and(new Criteria("arg11").expression(arg11))
            ;
    
            return new ArrayList<>(testSolrTemplate.queryForPage(new SimpleQuery(criteria).setRows(2147483647), Test.class).getContent());
        }
    
    }
    

    最好的,托马斯

    【讨论】:

      猜你喜欢
      • 2019-04-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多