#android #android-sqlite #ormlite
#Android #android-sqlite #ormlite
Вопрос:
Я пытаюсь выполнить запрос, в котором есть троичный оператор внутри оператора select:
SELECT id,
memory_id,
CASE
WHEN word_to =? THEN word_from
ELSE word_to
end
FROM translations
WHERE word_to =?
OR word_from =?
Как я могу создать такой запрос, используя QueryBuilder
объект? Я пытался:
public List<Translation> findMeanings(long wordId) {
try {
Dao<Translation, Long> translations = getDao(Translation.class);
QueryBuilder<Translation, Long> queryBuilder = translations.queryBuilder();
String id = Long.toString(wordId);
queryBuilder.selectRaw(DBColumns.ID, DBColumns.MEMORY_ID, "CASE WHEN word_to=" id " THEN word_from ELSE word_to END");
queryBuilder.where().eq(DBColumns.WORD_TO, id).or().eq(DBColumns.WORD_FROM, id);
return queryBuilder.query();
} catch (SQLException e) {
Logger.error("db", e.getMessage(), e);
}
return new ArrayList<Translation>();
}
Но я получаю исключение:
Не удалось скомпилировать этот оператор SELECT_RAW, поскольку вызывающий ожидает оператор SELECT. Проверьте свои методы QueryBuilder.
Класс перевода:
@DatabaseTable(tableName = DatabaseTables.TABLE_TRANSLATIONS)
public class Translation extends BaseEntity {
@DatabaseField(foreign = true, foreignColumnName = DBColumns.ID, columnName = DBColumns.WORD_TO)
private Word wordTo;
@DatabaseField(foreign = true, foreignColumnName = DBColumns.ID)
private Memory memory;
//...
где BaseEntity — это:
public class BaseEntity {
@DatabaseField(generatedId = true, unique = true)
protected long id;
//....
Ответ №1:
Не удалось скомпилировать этот оператор SELECT_RAW, поскольку вызывающий ожидает оператор SELECT. Проверьте свои методы QueryBuilder.
Как только вы вызовете qb.selectRaw(...)
, вам нужно будет использовать qb.queryRaw(...)
вместо query()
. Это упоминается в javadocs для selectRaw(...)
:
Добавьте необработанные столбцы или агрегатные функции (COUNT, MAX, …) в запрос. Это превратит запрос во что-то, подходящее только для оператора типа Dao.queryRaw(String, String …) .Это можно вызвать несколько раз, чтобы добавить дополнительные столбцы для выбора.
Обычно selectRaw(...)
используется с какой-то функцией агрегирования, такой как COUNT()
или MAX()
, и поэтому не совместим с типом объекта, возвращаемым query()
.