2

我正在使用 ORM (ORMlite) 并且我的所有调用都运行良好,直到出现以下错误。

线程“main”org.h2.jdbc.JdbcSQLException 中的异常:SQL 语句中的语法错误“SELECT * FROM”“STORIES”“WHERE”“TITLE”“='Deepcut case 导致'NOT FOLLOWED[*]''”;SQL 语句:SELECT * FROM StoriesWHEREtitle= '深度案例导致'未遵循'' [42000-152] at org.h2.message.DbException.getJdbcSQLException(DbException.java:327) at org.h2.message.DbException.get(DbException.java:167) at 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.stmt.mapped.MappedPreparedStmt.compile(MappedPreparedStmt.java:44) 在 com.j256.ormlite.jdbc.JdbcDatabaseConnection.compileStatement(JdbcDatabaseConnection.java:83) 在 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 中,您应该使用SelectArg将使用 SQL 生成查询的功能?参数,然后将字符串直接传递给准备好的语句。

请参阅. 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

我有点猜测,但看起来title字段中的值有问题,也许是未转义的引号?

我不熟悉 ORMLite,但title = 'Deepcut case leads 'not followed''看起来不正确。应该是"Deepcut case leads 'not followed'"'Deepcut case leads \'not followed\''或类似的。

于 2011-03-12T05:47:21.607 回答
1

该语句的正确语法是:

SELECT * FROM Stories WHERE title = 'Deepcut case lead ''not follow'' ';

注意字符串文字中重复的单引号。

你需要告诉你的 ORM 层遵循 ANSI SQL 的文字规则。

于 2011-03-12T08:24:55.137 回答
0

异常表示您生成的 SELECT 语句存在一些语法问题。你能打印出生成的查询吗?这样做可能会帮助您确定此处的确切问题。

编辑:仔细查看您的跟踪表明这里没有正确处理字符串转义。这是您自己的 QueryBuilder 吗?另外,根据此链接,您是使用SelectArg还是直接设置标题?

于 2011-03-12T05:44:44.743 回答