Room SQL: объект запроса с отношением 1-ко-многим с использованием параметров WHERE в обеих таблицах - PullRequest
0 голосов
/ 07 мая 2019

У меня есть эти классы:

@Entity
public class Person {
    long id;
    String name;
}


@Entity
public class Dog {
    long id;
    String color;

    long idPerson;
}


public class PersonWithDog {
    @Embedded
    Person person;

    @Relation(parentColumn = "id", entityColumn = "idPerson", entity =     Dog.class)
    List<Dog> dogs;
}

Я хочу сделать запрос, чтобы вернуть человека и список из только черных собак , которыми он владеет.Что-то вроде:

SELECT * FROM Person 
LEFT JOIN Dogs ON Person.id = Dogs.idPerson 
WHERE Person.id = ? AND Dogs.color = black

Возможно ли это с помощью Room?

** Примечание: если я сделаю POJO следующим образом:

public class PersonWithDog {
    @Embedded
    Person person;

    @Embedded
    List<Dog> dogs;
}

и воспользуюсь приведенным выше запросом, Room не узнает, как сопоставить поля List, поскольку не принимает встроенный список ...

1 Ответ

0 голосов
/ 10 мая 2019

Если больше ничего не помогло, это грязное решение может помочь вам в крайнем случае.Обратите внимание, что тип возвращаемого значения не может быть LiveData, и вы должны вызывать метод каждый раз, когда вам нужны данные (и, возможно, обернуть его результат в SingleLiveEvent или что-то в этом роде):

@Dao
public abstract class MyDao {

    // Call this method
    @Transaction
    Map<Person, List<Dog>> getPersonBlackDogs(long personId) {
        Person person = getPerson(personId);
        List<Dog> blackDogs = getBlackDogs(personId);
        return Collections.singletonMap(person, blackDogs);
    }

    // You do not want to expose these two methods so make theme protected

    @Query("SELECT * FROM Person WHERE id = :personId")
    protected abstract Person getPerson(long personId);

    @Query("SELECT * FROM Dog WHERE idPerson = :personId AND Dog.color = black")
    protected abstract List<Dog> getBlackDogs(long personId);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...