使用ORMLite准备查询的SQLexception

我正在使用ORM(ORMlite),我的所有调用都进行得很顺利,直到我收到以下错误。

线程“main”中的exceptionorg.h2.jdbc.JdbcSQLException:SQL语句中的语法错误“SELECT * FROM”“STORIES”“WHERE”“TITLE”“=’Deepcut case leads’not following [*]””; SQL语句:SELECT * FROM Stories WHERE title =’Deepcut case leads’未在org.h2.message.DbException的org.h2.message.DbException.getJdbcSQLException(DbException.java:327)处跟随”[42000-152]。在org.h2.message.DbException.get(xbException.java:144)的org.h2.message.DbException.getSyntaxError(DbException.java:179)org.h2.command.Parser上获取(DbException.java:167)位于org.h2.engine的org.h2.engine.Session.prepareLocal(Session.java:426)的org.h2.command.Parser.prepareCommand(Parser.java:229)中的.getSyntaxError(Parser.java:480)。 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.S tatementExecutor.buildIterator(StatementExecutor.java:169)at com.j256.ormlite.stmt.StatementExecutor.query(StatementExecutor.java:119)at com.j256.ormlite.dao.BaseDaoImpl.query(BaseDaoImpl.java:189)

我很困惑,哪些是错的。 我从这些行调用搜索:

 // get our query builder from the DAO QueryBuilder 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 preparedQuery = queryBuilder.prepare(); // query for all stories that have that title List accountList = StoryDao.query(preparedQuery); 

SQL语句中的语法错误“SELECT * FROM”“STORIES”“WHERE”“TITLE”“…

@bemace是正确的,标题中的引号似乎搞砸了查询生成的字符串的转义。

在ORMLite中,您应该使用SelectArgfunction,该function将使用SQL生成查询? 参数然后直接将字符串传递给预准备语句。

有关SelectArg文档,请参阅:

http://ormlite.com/docs/select-arg

使用SelectArg ,您可以执行以下操作:

 QueryBuilder queryBuilder = StoryDao.queryBuilder(); SelectArg titleArg = new SelectArg(); queryBuilder.where().eq(Story.TITLE_FIELD_NAME, titleArg); PreparedQuery preparedQuery = queryBuilder.prepare(); titleArg.setValue(title); List accountList = StoryDao.query(preparedQuery); 

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

我不熟悉ORMLite但是title = 'Deepcut case leads 'not followed''看起来不对。 应该是"Deepcut case leads 'not followed'"'Deepcut case leads \'not followed\''或某些此类。

该语句的正确语法是:

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

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

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

例外情况表明生成的SELECT语句存在一些语法问题。 你能打印出生成的查询吗? 这样做可能会帮助您确定这里的确切问题。

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