ORMLite where子句在使用中

时间:2014-02-10 11:07:18

标签: java android ormlite where-in

我对ORMlite Where#in有疑问。基本上我希望这接受一个ORM映射bean列表并在子句中使用它们的id。但它似乎没有这样做。

如果我传入一个List<Long>作为第二个参数,该列表只包含id,一切顺利。

如果我使用原始Element传入列表,我会:

 getElementFromDatabase() / No element with properly properties with this id in DB.
 getElements() / Can't get elements.
 java.sql.SQLException: Problems executing Android query: SELECT * FROM `elements` WHERE `_id` IN (com.mypackage.myapp.database.Element@417ff150 ) 
  at com.j256.ormlite.misc.SqlExceptionUtil.create(SqlExceptionUtil.java:22)
  at com.j256.ormlite.android.AndroidCompiledStatement.getCursor(AndroidCompiledStatement.java:184)
  at com.j256.ormlite.android.AndroidCompiledStatement.runQuery(AndroidCompiledStatement.java:65)
  at com.j256.ormlite.stmt.SelectIterator.<init>(SelectIterator.java:55)
  at com.j256.ormlite.stmt.StatementExecutor.buildIterator(StatementExecutor.java:247)
  at com.j256.ormlite.stmt.StatementExecutor.query(StatementExecutor.java:196)
  at com.j256.ormlite.dao.BaseDaoImpl.query(BaseDaoImpl.java:265)
  at com.j256.ormlite.stmt.QueryBuilder.query(QueryBuilder.java:361)
  at com.mypackage.myapp.presentation.DatabaseManager.getElements(DatabaseManager.java:248)
  at com.mypackage.myapp.presentation.DatabaseManager.getElementsByState(DatabaseManager.java:305)
  at java.lang.reflect.Method.invokeNative(Native Method)
  at java.lang.reflect.Method.invoke(Method.java:511)
  at junit.framework.TestCase.runTest(TestCase.java:154)
  at junit.framework.TestCase.runBare(TestCase.java:127)
  at junit.framework.TestResult$1.protect(TestResult.java:106)
  at junit.framework.TestResult.runProtected(TestResult.java:124)
  at junit.framework.TestResult.run(TestResult.java:109)
  at junit.framework.TestCase.run(TestCase.java:118)
  at android.test.AndroidTestRunner.runTest(AndroidTestRunner.java:169)
  at android.test.AndroidTestRunner.runTest(AndroidTestRunner.java:154)
  at android.test.InstrumentationTestRunner.onStart(InstrumentationTestRunner.java:545)
  at android.app.Instrumentation$InstrumentationThread.run(Instrumentation.java:1551)
 Caused by: android.database.sqlite.SQLiteException: near ".": syntax error: , while compiling: SELECT * FROM `elements` WHERE `_id` IN (com.mypackage.myapp.database.Elements@417ff150 )
  at android.database.sqlite.SQLiteCompiledSql.native_compile(Native Method)
  at android.database.sqlite.SQLiteCompiledSql.<init>(SQLiteCompiledSql.java:68)
  at android.database.sqlite.SQLiteProgram.compileSql(SQLiteProgram.java:143)
  at android.database.sqlite.SQLiteProgram.compileAndbindAllArgs(SQLiteProgram.java:361)
  at android.database.sqlite.SQLiteProgram.<init>(SQLiteProgram.java:127)
  at android.database.sqlite.SQLiteProgram.<init>(SQLiteProgram.java:94)
  at android.database.sqlite.SQLiteQuery.<init>(SQLiteQuery.java:53)
  at android.database.sqlite.SQLiteDirectCursorDriver.query(SQLiteDirectCursorDriver.java:47)
  at android.database.sqlite.SQLiteDatabase.rawQueryWithFactory(SQLiteDatabase.java:1570)
  at android.database.sqlite.SQLiteDatabase.rawQuery(SQLiteDatabase.java:1542)
  at com.j256.ormlite.android.compat.BasicApiCompatibility.rawQuery(BasicApiCompatibility.java:15)
  at com.j256.ormlite.android.AndroidCompiledStatement.getCursor(AndroidCompiledStatement.java:180)

班级Element包含以下内容:

@DatabaseTable(tableName = Constants.TABLE_ELEMENTS)
public class Element implements Serializable
{

 @DatabaseField(columnName = Constants.COL_ELEMENTS_KEY_ID, id = true)
 private long _id;

它可以是注释的东西吗?我是否按预期使用该方法?

编辑请求的两段代码:

List<Element> elements =....;
where.in(Constants.SET_ELEMENTS_ID, elements);

以上内容在问题的第一个版本中引发了异常。

List<Element> elements =....;
List<Long> ids = new ArrayList<Long>();
for (Element element: elements) {
    ids.add(element.getId();
}
where.in(Constants.SET_ELEMENTS_ID, ids);

按需工作,但很麻烦。

0 个答案:

没有答案