Троичный оператор в инструкции select

#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() .