我正在使用ORM(ORMlite),所有调用都进行得很顺利,直到我收到以下错误。
线程“main”中的异常org.h2.jdbc.JdbcSQLException:SQL语句中的语法错误“ SELECT * FROM“”STORIES“”WHERE“”TITLE“”='Deepcut case lead'NOT FOLLOWED [*]''“; SQL语句: SELECT * FROM
Stories
WHEREtitle
='Deepcut case leads'未遵循''[42000-152] at org.h2.message.DbException.getJdbcSQLException(DbException.java:327) at org.h2.message.DbException.get(DbException.java:167) 在org.h2.message.DbException.get(DbException.java:144) at 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)
我很困惑,哪些是错的。我从这些方面调用搜索:
// 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);
答案 0 :(得分:10)
SQL语句中的语法错误“SELECT * FROM”“STORIES”“WHERE”“TITLE”“...
@bemace是正确的,标题中的引号似乎搞砸了查询生成的字符串的转义。
在ORMLite中,您应该使用SelectArg
功能,该功能将使用SQL生成查询?参数然后直接将字符串传递给预准备语句。
有关SelectArg
的文档,请参阅:
使用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);
答案 1 :(得分:1)
我有点猜测,但看起来title
字段中的值存在问题,可能是未转义的引号?
我对ORMLite并不熟悉,但title = 'Deepcut case leads 'not followed''
看起来并不合适。应该是"Deepcut case leads 'not followed'"
或'Deepcut case leads \'not followed\''
或其他一些。
答案 2 :(得分:1)
该语句的正确语法是:
SELECT * FROM Stories WHERE title = 'Deepcut case leads ''not followed'' ';
请注意字符串文字中重复的单引号。
您需要告诉您的ORM层遵循文字的ANSI SQL规则。
答案 3 :(得分:0)
异常表示生成的SELECT语句存在一些语法问题。你能打印出生成的查询吗?这样做可能会帮助您确定问题。
编辑:仔细查看您的跟踪显示此处未正确处理字符串转义。这是你自己的QueryBuilder吗?另外,根据this link,您使用SelectArg
还是直接设置标题?