Ошибка в запросе помещения для возврата подмножества столбцов - PullRequest
0 голосов
/ 22 ноября 2018

Я играл с 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();

Result

ошибка: столбцы, возвращаемые запросом, не имеют полей [id] в ***. Employee, даже если они помечены как ненулевые или примитивные.Столбцы, возвращаемые запросом: [first_name, last_name]

Если я добавлю id к Query 2, это будет работать.

То же самое, если у нас есть Foreign Key в таблице, и мы пытаемся запросить подмножество столбцов, он выдает ошибку.Ошибка возникает, когда мы добавляем в запрос оба столбца Primary Key & Foreign Key.

Вопрос 1 Означает ли это, что мы всегда должны включать Primary Key & Foreign Key (еслиприсутствует) в запросе?

Вопрос 2 Что на самом деле происходит под капотом, когда выдает такую ​​ошибку?Или я что-то не так делаю?

Версия для комнаты 1.1.1

Также ссылался на эту ссылку , но это не решает мою проблему сПервичные ключи.

Ответы [ 2 ]

0 голосов
/ 23 ноября 2018

Чтобы выбрать данные из нескольких полей, рассмотрите пример ниже.

Из документов

Комната позволяет вам возвращать любой объект на основе 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();
}
0 голосов
/ 22 ноября 2018

Я думаю, что вы должны включить в
@ColumnInfo(name = "id") @PrimaryKey private int id;

, потому что в соответствии с выданной ошибкой нет такого столбца, существующего как id в вашей сущности по вышеуказанному запросу, сначала id столбцаназывается совпадением идентификатора столбца таблицы, а затем задает первичный ключ с помощью аннотации

...