2016-10-20 3 views
3

Я использую кеш-ключ зажигания с ключом как String и значением, так как Collection of objects (аналогичный тип) говорит List.Запускать кеш запросов со значением как список объектов

Теперь я хотел бы запросить у студентов, хранящихся в кеше, скажем, 5 лучших студентов.

определил конфигурацию, как показано ниже

CacheConfiguration<String, List<Student>> cfg = new CacheConfiguration<String, List<Student>>("students"); 
ignite = Ignition.start("/usr/localc/ignite/examples/config/example-ignite.xml"); 
cfg.setIndexedTypes(String.class, List.class); 

Теперь я выпустил запрос как

SqlFieldsQuery qry = new SqlFieldsQuery("select count(*) from Person"); 

Затем получил исключение как

Exception in thread "main" java.lang.AbstractMethodError: org.apache.ignite.internal.processors.query.h2.opt.GridH2Table$ScanIndex.getCost(Lorg/h2/engine/Session;[I[Lorg/h2/table/TableFilter;ILorg/h2/result/SortOrder;Ljava/util/HashSet;)D 
at org.h2.table.TableFilter.getBestPlanItem(TableFilter.java:203) 
at org.h2.table.Plan.calculateCost(Plan.java:123) 
at org.h2.command.dml.Optimizer.testPlan(Optimizer.java:183) 
at org.h2.command.dml.Optimizer.calculateBestPlan(Optimizer.java:79) 
at org.h2.command.dml.Optimizer.optimize(Optimizer.java:242) 
at org.h2.command.dml.Select.preparePlan(Select.java:1014) 
at org.h2.command.dml.Select.prepare(Select.java:878) 
at org.h2.command.Parser.prepareCommand(Parser.java:259) 
at org.h2.engine.Session.prepareLocal(Session.java:560) 
at org.h2.engine.Session.prepareCommand(Session.java:501) 
at org.h2.jdbc.JdbcConnection.prepareCommand(JdbcConnection.java:1202) 
at org.h2.jdbc.JdbcPreparedStatement.<init>(JdbcPreparedStatement.java:73) 
at org.h2.jdbc.JdbcConnection.prepareStatement(JdbcConnection.java:290) 
at org.apache.ignite.internal.processors.query.h2.IgniteH2Indexing.prepareStatement(IgniteH2Indexing.java:406) 
at org.apache.ignite.internal.processors.query.h2.IgniteH2Indexing.queryTwoStep(IgniteH2Indexing.java:1121) 
at org.apache.ignite.internal.processors.query.GridQueryProcessor$2.applyx(GridQueryProcessor.java:732) 
at org.apache.ignite.internal.processors.query.GridQueryProcessor$2.applyx(GridQueryProcessor.java:730) 
at org.apache.ignite.internal.util.lang.IgniteOutClosureX.apply(IgniteOutClosureX.java:36) 
at org.apache.ignite.internal.processors.query.GridQueryProcessor.executeQuery(GridQueryProcessor.java:1666) 
at org.apache.ignite.internal.processors.query.GridQueryProcessor.queryTwoStep(GridQueryProcessor.java:730) 
at org.apache.ignite.internal.processors.cache.IgniteCacheProxy.query(IgniteCacheProxy.java:700) 
at com.tcs.enm.processor.Main.main(Main.java:47) 

Может ли один помочь мне, как запросить ?? ?

ответ

2

Для выполнения такого запроса вы должны хранить каждый Student в качестве отдельной записи. Student класс должен иметь все аннотаций определения полей и индексов, и конфигурация кэш должен выглядеть следующим образом:

cfg.setIndexedTypes(String.class, Student.class); 

Для получения более подробной информации обратитесь к этой документации: https://apacheignite.readme.io/docs/sql-queries

+0

В моем случае использования есть несколько миллионов студентов ... из-за других деловых дел мне нужно иметь ценность как список учеников, а ключ может быть год, университет, колледж и т. Д. – sridhar

+0

Почему вы хотите это ключи? Добавьте их как поля значений и настройте индексы для быстрого поиска. –

1

Для тех, кто в будущем, кто имеет эту проблему, это сообщение об ошибке, вероятно, связано с неправильной версией H2.

http://apache-ignite-users.70518.x6.nabble.com/Exception-while-trying-to-access-cache-via-JDBC-API-td8648.html#a8651

Если вы используете Воспламенение 1.7, вам нужно h2database 1.4.191. Заметим, что h2database 1.4.192 даст вам исключение в вопросе, потому что есть некоторые изменения в 192, которые Ignite не были обработаны

Я прошел через свои пакеты и изменил версию H2 до 1.4.191, и это исправлены мои проблемы.