选择语句中的三元运算符

时间:2014-06-29 03:15:14

标签: 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 个答案:

答案 0 :(得分:2)

  

由于调用者期望SELECT语句,因此无法编译此SELECT_RAW语句。检查QueryBuilder方法。

只要您拨打qb.selectRaw(...),就需要使用qb.queryRaw(...)代替query()。这在javadocs for selectRaw(...)

中提到
  

将原始列或聚合函数(COUNT,MAX,...)添加到查询中。 这会将查询转换为仅适用于Dao.queryRaw(String,String ...)类型语句的内容。这可以多次调用以添加更多列进行选择。

通常selectRaw(...)与某种聚合函数(如COUNT()MAX()一起使用,因此与query()返回的实体类型不兼容。