2016-12-08 2 views
1

У меня есть кэш studentinfo для класса StudentInfo и кэш classinfo для ClassInfo, Этих два класса используется, чтобы сделать присоединиться (Student имеет атрибут Classid)Ошибки при выполнении внутреннего соединения с поперечным кэшем присоединиться

С следующий фрагмент кода,

SqlFieldsQuery innerJoinSQL = new SqlFieldsQuery(
      "select StudentInfo.studentId, StudentInfo.name, StudentInfo.classId from StudentInfo as a, " + 
      "\"class_cache\".ClassInfo as b where a.classId = b.classId"); 
cursor = studentCache.query(innerJoinSQL); 
for (List data : cursor) { 
    System.out.println(String.format("studentId %s, studentName %s, classId %s, className %s", data.get(0), data.get(1), data.get(2), data.get(3))); 
} 

я получил следующее исключение:

Exception in thread "main" javax.cache.CacheException: Failed to parse query: select a.studentId, a.name, a.classId, b.name from StudentInfo a, 'class_cache'.ClassInfo b on a.classId = b.classId 
    at org.apache.ignite.internal.processors.query.h2.IgniteH2Indexing.queryTwoStep(IgniteH2Indexing.java:1137) 
    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 ignite.sqlgrid.join.IgniteSQLJoinQueryTest.main(IgniteSQLJoinQueryTest.java:75) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:88) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:55) 
    at java.lang.reflect.Method.invoke(Method.java:613) 
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:144) 
Caused by: org.h2.jdbc.JdbcSQLException: Syntax error in SQL statement "SELECT A.STUDENTID, A.NAME, A.CLASSID, B.NAME FROM STUDENTINFO A, 'class_cache'[*].CLASSINFO B ON A.CLASSID = B.CLASSID "; expected "identifier"; SQL statement: 
select a.studentId, a.name, a.classId, b.name from StudentInfo a, 'class_cache'.ClassInfo b on a.classId = b.classId [42001-191] 
    at org.h2.message.DbException.getJdbcSQLException(DbException.java:345) 
    at org.h2.message.DbException.getSyntaxError(DbException.java:205) 
    at org.h2.command.Parser.readIdentifierWithSchema(Parser.java:3115) 
    at org.h2.command.Parser.readTableFilter(Parser.java:1202) 
    at org.h2.command.Parser.parseSelectSimpleFromPart(Parser.java:1884) 
    at org.h2.command.Parser.parseSelectSimple(Parser.java:2032) 
    at org.h2.command.Parser.parseSelectSub(Parser.java:1878) 
    at org.h2.command.Parser.parseSelectUnion(Parser.java:1699) 
    at org.h2.command.Parser.parseSelect(Parser.java:1687) 
    at org.h2.command.Parser.parsePrepared(Parser.java:443) 
    at org.h2.command.Parser.parse(Parser.java:315) 
    at org.h2.command.Parser.parse(Parser.java:287) 
    at org.h2.command.Parser.prepareCommand(Parser.java:252) 
    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:1188) 
    at org.h2.jdbc.JdbcPreparedStatement.<init>(JdbcPreparedStatement.java:73) 
    at org.h2.jdbc.JdbcConnection.prepareStatement(JdbcConnection.java:276) 
    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) 
    ... 12 more 

Может какая-то помощь, где проблема? Благодаря!

ответ

-2

Выглядит, я понял проблему. Мои два поля (StudentInfo и ClassInfo) для каждого кеша имеют один столбец с именем classId. Выглядит только одно pojo может установить index = true с аннотацией @QuerySqlField(index = true) в поле classId

Но я не уверен, что у Ingite есть такое ограничение. Если кто-то знает, позвольте подтвердить, спасибо!

+1

Ваша первоначальная проблема заключалась в неправильном цитировании имени кеша. –

+0

недействителен? Я тебя не понял. Можете ли вы объяснить больше? Для меня я не изменил sql, но просто изменил индекс на false, и он работает. – Tom

+0

Я не уверен, что здесь представляет собой настоящая проблема, но то, что вы описали, определенно не соответствует действительности (если нет какой-то сумасшедшей ошибки). Было бы проще помочь, если бы вы могли создать небольшой проект GitHub с тестом, чтобы каждый мог запустить его и воспроизвести поведение. –

Смежные вопросы