2016-05-12 17 views
2

Gibt es eine Möglichkeit zum Ausführen von SQL-Felder Abfrage auf Apache für Binärobjekt gezündet (ohne Java-Klasse zu definieren)?Apache Iginte BinaryObject SqlFieldsQuery

Ich möchte etwas wie folgt auszuführen:

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"}); 

Aber ich habe eine Ausnahme, dass Feld bekam nicht definiert ist:

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

Antwort

2

BinaryObject ist eine Schnittstelle, die keine Indizes hat Definitionen. Sie müssen auf der Clientseite eine genaue Klassendefinition Ihrer Domänenklasse an CacheConfiguration.setIndexedTypes(...) übergeben, die Klassendefinitionen haben sollte, und Ignite wird Informationen zu den eingerichteten Indizes sammeln.

Wenn Sie überhaupt keine Klassen haben (selbst auf der Client-Seite), dann können Sie Indizes mit QueryEntity direkt wie beschrieben here definieren.

Es ist auch nicht notwendig, ein Objekt als eine Art BinaryObject zu definieren. Ihre Objekte werden automatisch serverseitig in diesem Format gespeichert. Die einzige Ausnahme sind Objekte, die die Methoden Externalizable implementieren oder die Methoden überschreiben. Solche Objekte können im Binärformat gespeichert werden, und auf der Serverseite müssen Klassendefinitionen für sie vorhanden sein. Weitere Informationen zum Binärformat finden Sie unter here.

Schließlich würde ich empfehlen, einen Blick auf CacheQueryExample zu werfen, die als Teil von Ignite Release geliefert wird. Die in diesem Beispiel verwendeten Objektmodelle werden im Binärformat gespeichert.

+0

Vielen Dank! Der Ansatz mit QueryEntity passt sehr gut. Weil wir überhaupt keine Klassendefinition haben und das Erstellen von binären Objekten zur Laufzeit der beste Weg für unsere Anwendung ist. –