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