2016-05-12 7 views
2

Javaクラスを定義せずにバイナリオブジェクトのApache igniteでsql fieldsクエリを実行する方法はありますか?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は、設定されているインデックスに関する情報を収集します。

クラスがまったく(クライアント側であっても)ない場合は、hereのように直接QueryEntityを使用してインデックスを定義できます。

また、オブジェクトをタイプBinaryObjectにする必要はありません。あなたのオブジェクトは自動的にこの形式でサーバー側に保存されます。唯一の例外は、Externalizableを実装するオブジェクトまたはSerializable.writeObject/readObjectメソッドをオーバーライドするオブジェクトです。このようなオブジェクトはバイナリ形式で保存でき、サーバー側でクラス定義を持つ必要があります。バイナリ形式の詳細については、hereを参照してください。

最後に、Igniteリリースの一部として提供されるCacheQueryExampleをご覧ください。この例で使用されるオブジェクトモデルは、バイナリ形式で格納されます。

+0

ありがとうございました! QueryEntityのアプローチは非常にうまくいきます。クラス定義はまったくありません。実行時にバイナリオブジェクトをビルドするのは、アプリケーションに最適な方法です。 –

関連する問題