房间查询错误以返回列子集

时间:2018-11-22 19:37:12

标签: android android-sqlite android-room android-architecture-components

我正在和Room一起玩,在那里找不到我的查询的解决方案。

下面是数据。

表格

CREATE TABLE `Employee` (
    `id` INTEGER NOT NULL,
    `first_name` TEXT,
    `last_name` TEXT,
    PRIMARY KEY(`id`)
);

表格数据

enter image description here

实体

@Entity(tableName = "Employee")
public class Employee {

    @PrimaryKey
    private int id;

    @ColumnInfo(name = "first_name")
    private String firstName;

    @ColumnInfo(name = "last_name")
    private String lastName;

    ..Getters & Setters..
}

查询1

@Query("Select * from Employee")
List<Employee> getEmployees();

结果 成功

查询2

@Query("Select first_name, last_name from Employee")
List<Employee> getEmployees();

结果

  

错误:查询返回的列在***。Employee中没有字段[id],即使它们被注释为非null或原始值也是如此。查询返回的列:[first_name,last_name]

如果我在id上方添加Query 2,则可以。

同样,如果表中有Foreign Key并尝试查询列子集,则会引发错误。当我们在查询中同时添加Primary KeyForeign Key列时,就会出现错误。

问题1  这是否意味着我们必须始终包含Primary KeyForeign Key  (如果存在)在查询中?

问题2 引发此类错误的事实到底是什么?还是我做错了什么?

客房版本 1.1.1

此外,请参阅此link,但它不能解决我的主键问题。

3 个答案:

答案 0 :(得分:1)

要从多个字段中选择数据,请考虑以下示例。

来自文档

  

Room允许您从查询中以以下形式返回任何基于Java的对象:   只要可以将结果列集映射到返回的列中   宾语。例如,您可以创建以下简单的基于Java的旧版本   对象(PO​​JO)以获取用户的名字和姓氏:

public class NameTuple {
    @ColumnInfo(name = "first_name")
    public String firstName;

    @ColumnInfo(name = "last_name")
    public String lastName;
}

现在,您可以在查询方法中使用此POJO:

@Dao
public interface MyDao {
    @Query("SELECT first_name, last_name FROM user")
    public List<NameTuple> loadFullName();
}

答案 1 :(得分:0)

  

我认为您应该包括在
          @ColumnInfo(name = "id") @PrimaryKey private int id;

     

由于根据所引发的错误,上述查询中在您的实体中不存在此类列,因此首先将列ID称为表列ID的匹配项,然后通过注释设置主键

答案 2 :(得分:0)

添加到@karan 的答案中,pojo 还可用于使用 as 子句返回命名列

例如。

select sum(score) as total_score, sum(avg) as avg_score from mytable

其中 pojo 类列名将分别为 total_score 和 avg_score ..