简体   繁体   English

选择语句中的三元运算符

[英]Ternary operator in select statement

I am trying to execute a query which has a ternary operator inside a select statement: 我试图执行一个查询,该查询在select语句中具有三元运算符:

SELECT id, 
       memory_id, 
       CASE 
         WHEN word_to =? THEN word_from 
         ELSE word_to 
       end 
FROM   translations 
WHERE  word_to =? 
       OR word_from =? 

How can I build such a query using a QueryBuilder object? 如何使用QueryBuilder对象构建这样的查询? I tried: 我试过了:

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>();
}

But I am getting an exception: 但我得到一个例外:

Could not compile this SELECT_RAW statement since the caller is expecting a SELECT statement. 由于调用者需要SELECT语句,因此无法编译此SELECT_RAW语句。 Check your QueryBuilder methods. 检查您的QueryBuilder方法。

Translation class: 翻译班:

@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;
    //...

where BaseEntity is: 其中BaseEntity是:

public class BaseEntity {

    @DatabaseField(generatedId = true, unique = true)
    protected long id; 
    //....

Could not compile this SELECT_RAW statement since the caller is expecting a SELECT statement. 由于调用者需要SELECT语句,因此无法编译此SELECT_RAW语句。 Check your QueryBuilder methods. 检查您的QueryBuilder方法。

As soon as you call qb.selectRaw(...) you will need to use qb.queryRaw(...) instead of query() . 调用qb.selectRaw(...)您将需要使用qb.queryRaw(...)而不是query() This is mentioned in the javadocs for selectRaw(...) : 这在javadocs中提到selectRaw(...)

Add raw columns or aggregate functions (COUNT, MAX, ...) to the query. 将原始列或聚合函数(COUNT,MAX,...)添加到查询中。 This will turn the query into something only suitable for the Dao.queryRaw(String, String...) type of statement. 这会将查询转换为仅适用于Dao.queryRaw(String,String ...)类型的语句的查询。 This can be called multiple times to add more columns to select. 可以多次调用此操作以添加更多列以供选择。

Typically the selectRaw(...) is used with some sort of aggregation function like COUNT() or MAX() and is therefore not compatible with an entity type returned by query() . 通常, selectRaw(...)与某种聚合函数(例如COUNT()MAX() ,因此与query()返回的实体类型不兼容。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM