使用ORMLite准备查询的SQL异常

时间:2011-03-12 01:39:38

标签: java sql exception h2 ormlite

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

  

线程“main”中的异常org.h2.jdbc.JdbcSQLException:SQL语句中的语法错误“       SELECT * FROM“”STORIES“”WHERE“”TITLE“”='Deepcut case lead'NOT FOLLOWED [*]''“; SQL语句:       SELECT * FROM Stories WHERE title ='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);

4 个答案:

答案 0 :(得分:10)

  

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

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

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

有关SelectArg的文档,请参阅:

  

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

使用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还是直接设置标题?