2

私は ORM (ORMlite) を使用していますが、次のエラーが発生するまで、すべての呼び出しがうまくいきます。

スレッド "main" org.h2.jdbc.JdbcSQLException での例外: SQL ステートメントの構文エラー " SELECT * FROM ""STORIES"" WHERE ""TITLE"" = 'Deepcut case lead 'NOT FOLLOWED[*]'' "; SQL ステートメント: SELECT * FROM StoriesWHEREtitle= 'Deepcut ケース リード 'フォローされていない'' [42000-152] org.h2.message.DbException.getJdbcSQLException(DbException.java:327) でorg.h2.message.DbException.get(DbException.java:144) で org.h2.message.DbException.getSyntaxError(DbException.java:179) で org.h2.command.Parser.getSyntaxError(Parser.java:480) org.h2.command.Parser.prepareCommand(Parser.java:229) で org.h2.engine.Session.prepareLocal(Session.java:426) で org.h2.engine.Session.prepareCommand(Session.java:374) ) org.h2.jdbc.JdbcConnection.prepareCommand(JdbcConnection.java:1093) で org.h2.jdbc.JdbcPreparedStatement.(JdbcPreparedStatement.java:71) で org.h2.jdbc.JdbcConnection.prepareStatement(JdbcConnection.java:601) com.j256.ormlite.jdbc.JdbcDatabaseConnection.compileStatement(JdbcDatabaseConnection.java:83) で com.j256.ormlite.stmt.mapped.MappedPreparedStmt.compile(MappedPreparedStmt.java:44) で com.j256.ormlite .stmt.StatementExecutor.buildIterator(StatementExecutor.java:169) com.j256.ormlite.stmt.StatementExecutor.query(StatementExecutor.java:119) com.j256.ormlite.dao.BaseDaoImpl.query(BaseDaoImpl.java:189) )119) com.j256.ormlite.dao.BaseDaoImpl.query (BaseDaoImpl.java:189) で119) com.j256.ormlite.dao.BaseDaoImpl.query (BaseDaoImpl.java:189) で

何がうまくいかないのか混乱しています。これらの行から検索を呼び出しています。

// get our query builder from the DAO
QueryBuilder<Story, Integer> queryBuilder = StoryDao.queryBuilder();
// the 'title' field must be equal to title (a variable)
queryBuilder.where().eq(Story.TITLE_FIELD_NAME, title);
// prepare our sql statement
PreparedQuery<Story> preparedQuery = queryBuilder.prepare();
// query for all stories that have that title
List<Story> accountList = StoryDao.query(preparedQuery);
4

4 に答える 4

11

SQL ステートメントの構文エラー " SELECT * FROM ""STORIES"" WHERE ""TITLE""...

クエリによって生成された文字列のエスケープを台無しにしているタイトルに引用符があるように見える @bemace は正しいです。

ORMLite では、SelectArgSQL でクエリを生成する機能を使用する必要があります。引数を指定してから、その文字列を準備済みステートメントに直接渡します。

のドキュメントをSelectArg参照してください。それを使用すると、次のようになります。

QueryBuilder<Story, Integer> queryBuilder = StoryDao.queryBuilder();
SelectArg titleArg = new SelectArg();
queryBuilder.where().eq(Story.TITLE_FIELD_NAME, titleArg);
PreparedQuery<Story> preparedQuery = queryBuilder.prepare();
titleArg.setValue(title);
List<Story> accountList = StoryDao.query(preparedQuery);
于 2011-03-12T17:26:32.723 に答える
1

ステートメントの正しい構文は次のとおりです。

SELECT * FROM Stories WHERE title='ディープカットケースリード''フォローされていません''';

文字列リテラル内の重複した一重引用符に注意してください。

リテラルのANSISQLルールに従うようにORMレイヤーに指示する必要があります。

于 2011-03-12T08:24:55.137 に答える
1

title推測ですが、フィールドの値に問題があるようです。エスケープされていない引用符でしょうか?

私はORMLiteに慣れていtitle = 'Deepcut case leads 'not followed''ませんが、正しく見えません。おそらく"Deepcut case leads 'not followed'"または'Deepcut case leads \'not followed\''そのようなものである必要があります。

于 2011-03-12T05:47:21.607 に答える
0

例外は、生成された SELECT ステートメントに構文上の問題があることを示しています。生成されたクエリを印刷できますか? そうすることで、ここで正確な問題を特定するのに役立つ場合があります。

編集:トレースをよく見ると、ここでは文字列のエスケープが適切に処理されていないことがわかります。これはあなた自身の QueryBuilder ですか? また、このリンクに従って、タイトルを使用していますSelectArgか、それとも直接設定していますか?

于 2011-03-12T05:44:44.743 に答える