Я пытаюсь использовать spring-data -asticsearch в моем проекте.Когда я хочу запросить некоторые данные, я использую queryForList(CriteriaQuery query, Class<T> clazz)
в ElasticsearchTemplate
.
Но я продолжал получать NullPointerException
снизу код:
List<QueryBuilder> negationFilters = buildNegationFilter(criteria.getField().getName(), criteria.getFilterCriteriaEntries().iterator());
Это исключение происходило только когда яхочу использовать not()
вместе с and()
.Когда я использую только not()
, это работает.
Вот мой код:
CriteriaQuery criteriaQuery = new CriteriaQuery(new Criteria()
.and(new Criteria("symbol").is("1111"))
.and(new Criteria("code").is("22").not()));
List<xx> sampleEntities = elasticsearchTemplate.queryForList(criteriaQuery,xx.class);
И я подозреваю, что, возможно, в исходном коде есть ошибки:
В CriteriaFilterProcessor
class,
ListIterator<Criteria> chainIterator = criteria.getCriteriaChain().listIterator();
while (chainIterator.hasNext()) {
QueryBuilder fb = null;
Criteria chainedCriteria = chainIterator.next();
if (chainedCriteria.isOr()) {
fb = QueryBuilders.boolQuery();
for(QueryBuilder f: createFilterFragmentForCriteria(chainedCriteria)){
((BoolQueryBuilder)fb).should(f);
}
fbList.add(fb);
} else if (chainedCriteria.isNegating()) {
List<QueryBuilder> negationFilters = buildNegationFilter(criteria.getField().getName(), criteria.getFilterCriteriaEntries().iterator());
if (!negationFilters.isEmpty()) {
fbList.addAll(negationFilters);
}
} else {
fbList.addAll(createFilterFragmentForCriteria(chainedCriteria));
}
}
В части else if (chainedCriteria.isNegating())
зачем использовать criteria
для получения поля?Я отладил его и обнаружил, что поле criteria
будет null
, но chainedCriteria
нет. Так это ошибка исходного кода или неправильный способ использования?