Apache Ignite:使用"IN"子句点燃存储库查询,不返回任何记录



我正在使用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 .
}

在此中,即使ignite具有name字段与查询中传递的数据匹配的CC_8,方法 findAllByName 始终返回空列表。我无法弄清楚语法或方法签名或参数的查询是否存在问题。

请尝试使用String[] names而不是提供参数。

更新:我刚刚检查了源,我们没有针对这种情况的测试。这意味着即使有可能上班,您也在未知领域。否则当前看起来不受支持。

我知道您的问题更特定于Spring Data Ignite功能。但是,作为替代方案,您可以使用IGNITE的SQLQLQUERY抽象来实现它。

您将像这样形成查询。我将下面的示例粘贴在您将编写的自定义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自定义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;
}

相关内容

  • 没有找到相关文章

最新更新