DAO 查询不适用于 MIN MAX 函数

DAO query does not work with MIN MAX functions

我为我的 android 应用程序设计了一个房间数据库。我所有的 DAO 接口方法都在工作,除非我在查询中有一个 min/max 函数。

这是实体的模拟 class:

@Entity
public class Data {

    @PrimaryKey
    @NonNull
    private String timestamp;

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

    ...Other stuff...
}

这里是一个 class 只有需要的部分:

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 函数似乎不起作用,我得到了 header 数据的列表,其中 item_key 是正确的,但所有 timestamps 是 null 。有人知道这个问题吗?

问题是您的 return 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();