我正在尝试执行一个在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;
//....
答案 0 :(得分:2)
由于调用者期望SELECT语句,因此无法编译此SELECT_RAW语句。检查QueryBuilder方法。
只要您拨打qb.selectRaw(...)
,就需要使用qb.queryRaw(...)
代替query()
。这在javadocs for selectRaw(...)
:
将原始列或聚合函数(COUNT,MAX,...)添加到查询中。 这会将查询转换为仅适用于Dao.queryRaw(String,String ...)类型语句的内容。这可以多次调用以添加更多列进行选择。
通常selectRaw(...)
与某种聚合函数(如COUNT()
或MAX()
一起使用,因此与query()
返回的实体类型不兼容。