Apache Ignite: запрос Ignite Repository с предложением IN, не возвращает записей - PullRequest
0 голосов
/ 04 марта 2019

Я использую Apache Ignite в качестве внутреннего хранилища данных в приложении SpringBoot.У меня есть требование, где мне нужно получить все сущности, чье имя совпадает с одним из имен из набора имен.

Поэтому я пытаюсь реализовать его, используя конфигурацию @Query и метод с именем findAllByName(Iterable<String> names) как показано ниже: здесь, в Query, я пытаюсь использовать предложение 'IN' и хочу передать массив names в качестве ввода в предложение 'IN'.

@RepositoryConfig(cacheName = "Category")
public interface CategoryRepository extends IgniteRepository<Category, Long> 
{
List<Category> findByName(String name);
@Query("SELECT * FROM Category WHERE name IN ( ? )")
Iterable<Category> findAllByName(Iterable<String> names); // this method always returns empty list .
}

В этом методе findAllByName всегда возвращает пустой список, даже если ignite имеет Categories, для которого поле name соответствует данным, переданным в запросе.Я не могу определить, есть ли проблема с синтаксисом или запросом сигнатуры метода или параметров.

Ответы [ 2 ]

0 голосов
/ 21 марта 2019

Я знаю, что ваш вопрос более специфичен для функции Spring Data Ignite.Однако, в качестве альтернативы, вы можете достичь этого, используя SqlQuery-абстракцию Ignite.

Вы сформируете свой запрос следующим образом.Я вставил приведенный ниже пример с пользовательской функцией sql inSet , которую вы напишите.Кроме того, ниже рассказывается, как это используется в вашем sql.

IgniteCache<String, MyRecord> cache = this.ignite
    .cache(this.environment.getProperty(Cache.CACHE_NAME));

String sql = "from “my-ignite-cache”.MyRecord WHERE  
MyRecord.city=?  AND inSet(?, MyRecord.flight)"

SqlQuery<String, MyRecord> sqlQuery = new SqlQuery<>(MyRecord.class,
    sql);

sqlQuery.setArgs(MyCity, [Flight1, Flight2 ] );

QueryCursor<Entry<String, MyRecord>> resultCursor = cache.query(sqlQuery);

. Вы можете перебрать курсор результата, чтобы сделать что-то значимое из извлеченных данных.

resultCursor.forEach(e -> {
    MyRecord record = e.getValue();
// do something with result
});

Ниже приведена функция Ignite Custom Sql , которая используется в приведенном выше запросе - это поможет реплицировать функцию предложения IN.

@QuerySqlFunction
public static boolean inSet(List<String> filterParamArgIds, String id) {
    return filterParamArgIds.contains(id);
}

Инаконец, в качестве ссылки MyRecord, упомянутой выше, можно определить что-то вроде этого.

public class MyRecord implements Serializable {

    @QuerySqlField(name = "city", index = true)
    private String city;

    @QuerySqlField(name = "flight", index = true)
    private String flight;
}
0 голосов
/ 04 марта 2019

Пожалуйста, попробуйте использовать вместо String[] names для предоставления параметров.

ОБНОВЛЕНИЕ: Я только что проверил источник, и у нас нет тестов для такого сценария.Это означает, что вы находитесь на неизведанной территории, даже если есть возможность добраться до работы.В противном случае выглядит неподдерживаемым в настоящее время.

...