问题描述
我有这些课程:
@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;
}
我想查询一个人并返回他拥有的只黑狗的列表.像这样:
I want to make a query to return a person and a list of only black dogs he owns. Something like:
SELECT * FROM Person
LEFT JOIN Dogs ON Person.id = Dogs.idPerson
WHERE Person.id = ? AND Dogs.color = black
使用Room可以吗?
**注意:如果我这样制作POJO:
**Note: If I make a POJO this way:
public class PersonWithDog {
@Embedded
Person person;
@Embedded
List<Dog> dogs;
}
并使用上面的查询,Room不会找出如何映射List的字段,因为它不接受嵌入式列表...
and use the above query, Room won't find out how to map the fields of List, as it doesn't accept an embedded list...
推荐答案
如果没有其他效果,此肮脏的解决方法可能会在最后帮助您.请注意,返回类型不能为 LiveData
,并且每次需要数据时都应调用该方法(并且可能将其结果包装在 SingleLiveEvent 之类的东西:
If nothing else worked, this dirty solution may help you as a last resort. Note that the return type could not be LiveData
and you should call the method every time you need the data (and perhaps wrap its result in a SingleLiveEvent or something):
@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);
}
这篇关于Room SQL:在两个表上都使用WHERE参数来查询具有一对多关系的对象的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!