我正在和Room一起玩,在那里找不到我的查询的解决方案。
下面是数据。
表格
CREATE TABLE `Employee` (
`id` INTEGER NOT NULL,
`first_name` TEXT,
`last_name` TEXT,
PRIMARY KEY(`id`)
);
表格数据
实体
@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 Key
和Foreign Key
列时,就会出现错误。
问题1
这是否意味着我们必须始终包含Primary Key
和Foreign Key
(如果存在)在查询中?
问题2 引发此类错误的事实到底是什么?还是我做错了什么?
客房版本 1.1.1
此外,请参阅此link,但它不能解决我的主键问题。
答案 0 :(得分:1)
要从多个字段中选择数据,请考虑以下示例。
来自文档
Room允许您从查询中以以下形式返回任何基于Java的对象: 只要可以将结果列集映射到返回的列中 宾语。例如,您可以创建以下简单的基于Java的旧版本 对象(POJO)以获取用户的名字和姓氏:
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 ..