2016-05-12 31 views
2

有什麼辦法可以在apache的點火器上運行sql字段查詢(二進制對象沒有定義java類)?Apache Iginte BinaryObject SqlFieldsQuery

我要執行這樣的事情:

CacheConfiguration<Integer, Object> cfg = new CacheConfiguration<>(); 
    cfg.setName("test_bo"); 
    cfg.setIndexedTypes(Integer.class, BinaryObject.class); 

    IgniteCache<Integer, Object> cache = ignite.getOrCreateCache(cfg); 
    BinaryObjectBuilder builder = ignite.binary().builder(BinaryObject.class.getName()); 
    BinaryObject object = builder.setField("xxx", "yyy").build(); 
    cache.put(1, object); 
    List<Object[]> collect = cache.withKeepBinary().query(
     new SqlFieldsQuery("select xxx from BinaryObject")).getAll().stream() 
      .map(list -> list.toArray(new Object[list.size()])) 
      .collect(Collectors.toList()); 
    assertThat(collect).containsExactly(new Object[]{"yyy"}); 

但我有那場沒有定義異常:

Caused by: org.h2.jdbc.JdbcSQLException: Column "XXX" not found; SQL statement: select xxx from BinaryObject [42122-175] 

回答

2

BinaryObject是不具有任何索引接口定義。您需要在客戶端將確切的類定義傳遞給客戶端的CacheConfiguration.setIndexedTypes(...),該定義應該具有類定義,並且Ignite將收集有關設置的索引的信息。

如果你根本沒有類(即使在客戶端),那麼你可以直接使用QueryEntity定義索引,如here所述。

此外,沒有必要使對象成爲BinaryObject的類型。您的對象將以這種格式自動存儲在服務器端。唯一的例外是實現Externalizable或覆蓋Serializable.writeObject/readObject方法的對象 - 這些對象可以以二進制格式存儲,並且您必須在服務器端爲它們定義類定義。有關二進制格式的更多信息,請參閱here

最後,我會建議看看CacheQueryExample作爲Ignite版本的一部分提供。本例中使用的對象模型以二進制格式存儲。

+0

謝謝! QueryEntity的方法非常適合。因爲我們根本沒有類定義,並且在運行時構建二進制對象是最適合我們應用程序的方式。 –