как использовать оператор «или» с CriteriaQuery в spring-data -asticsearch - PullRequest
0 голосов
/ 16 мая 2019

В последнее время я пытаюсь использовать spring-data-elasticsearch в своем проекте и столкнулся с множеством проблем. Я вчера задал вопрос о not операции, но решил сам. И теперь я столкнулся с другой проблемой при попытке использовать or оператор.

Вот что я хочу:

Я хочу запросить объект с code, который не равен "11" и его symbol равен "22" или subSymbol равен "33". Я пытался много раз во многих отношениях, но потерпел неудачу. Кажется, я не могу заставить его работать с CriteriaQuery. Я не знаю, четко ли я описал свой вопрос. А в SQL он должен быть написан так:

select from x where x.code!='11' and (x.symbol='22' or x.subSymbol='33')

Но с CriteriaQuery я всегда получаю результаты, если значение symbol/subSymbol соответствует и условие code отсутствует, его SQL работает следующим образом:

select from x where x.code!='11' or x.symbol='22' or x.subSymbol='33'

Вот что я пытаюсь:

1.
CriteriaQuery criteriaQuery = new CriteriaQuery(new Criteria()
                .and("code").is("11").not()
                .or("symbol").is("22").or("subSymbol").is("33"));
2.
CriteriaQuery criteriaQuery = new CriteriaQuery(new Criteria()
                .and("code").is("11").not()
                .or(new Criteria("symbol").is("22").and("subSymbol").is("33")));


3.
CriteriaQuery criteriaQuery = new CriteriaQuery(new Criteria()
                .and("code").is("11").not()
                .and(new Criteria("symbol").is("22").or("subSymbol").is("33")));

4.
CriteriaQuery criteriaQuery = new CriteriaQuery(new Criteria()
                .and("code").is("11").not())
                .addCriteria(new Criteria("symbol").is("22").or("subSymbol").is("33"));


List<xx> sampleEntities =
                elasticsearchTemplate.queryForList(criteriaQuery,xx.class);

Все вышеперечисленное не удалось.

Так есть какое-нибудь решение для решения моей проблемы? Или мне нужно попробовать NativeSearchQueryBuilder. Это так расстраивает.

1 Ответ

0 голосов
/ 16 мая 2019

Я думаю, что вам нужно проиндексировать ваши свойства как Условия, потому что вы используете их как некоторые коды (номенклатуры). Вы можете сохранить существующую индексацию в виде текста, если она понадобится вам в будущем. Так что я нашел этот учебник, который выглядит легко реализуемым для вашего случая.

https://www.baeldung.com/spring-data-elasticsearch-queries

Так что, если вы добавите @InnerField к своим полям и используете запрос 2., но используете суффикс verbatim для полей, он должен работать с запросом № 2 из вашего списка. Ваши поля будут выглядеть как code.verbatim и т. Д. *

Также вы можете подумать о переходе на NativeSearchQueryBuilder.

...