DAO查询不适用于MIN MAX函数

时间:2018-07-31 14:11:20

标签: android sql dao android-room android-jetpack

我为我的android应用程序设计了一个room db。我的所有DAO接口方法都可以使用,除非查询中具有最小/最大函数。

这里是实体类的模拟:

@Entity
public class Data {

    @PrimaryKey
    @NonNull
    private String timestamp;

    @ColumnInfo(name = "item_key")
    private int itemKey;

    ...Other stuff...
}

这是一个仅包含所需部分的类:

public class HeaderData {
    private int item_key;
    private String timestamp;

    public HeaderData(int item_key, String timestamp) {
        this.item_key = item_key;
        this.timestamp = timestamp;
    }
}

这是DAO界面:

@Dao
public interface LocationDao {

    @Insert
    void insertSingleRecord(Data data);

    @Query("SELECT * FROM Data")
    List<LocationData> getEverything();

    @Query("SELECT * FROM Data WHERE item_key = :itemKey")
    List<Data> getDbData(int itemKey);

    // I dont know why this query is not working!
    @Query("SELECT item_key, MIN(timestamp) FROM LocationData GROUP BY item_key")
    List<HeaderData> getHeaderData();
}

在上一次查询getHeaderData()中,MIN函数似乎无法正常工作,我获得了包含正确item_key的标头数据列表,但所有timestamp都是{{ 1}}。有人知道这个问题吗?

1 个答案:

答案 0 :(得分:3)

问题在于您返回的pojo并非您从数据库中查询的完全一样:

// I dont know why this query is not working!
    @Query("SELECT item_key, MIN(timestamp) FROM LocationData GROUP BY item_key")
    List<HeaderData> getHeaderData();

HeaderData确实具有item_key,但是MIN(timestamp)与时间戳不同,它是另一列。这就是时间戳记为空的原因。您可以做的就是这样定义您的pojo:

public class HeaderData {
    private int item_key;
    private String minTimestamp;


    public HeaderData(int item_key, String minTimestamp) {
        this.item_key = item_key;
        this.minTimestamp = minTimestamp;
    }
}

并这样重新定义您的查询:

    @Query("SELECT item_key, MIN(timestamp) as minTimestamp  FROM LocationData GROUP BY item_key")
    List<HeaderData> getHeaderData();