Использование аннотации @Relation.Я могу запросить отношение один ко многим, используя следующее:
@Dao
public interface PostDao {
@Query("SELECT * FROM post")
List<PostWithComments> getPostWithComments();
}
Вот сущности
@Entity
public class Post {
@PrimrayKey
private int id;
private String title;
private String content;
}
@Entity
public class Comment {
@PrimrayKey
private int id;
private int post_id;
private String content;
private String status;
}
public class PostWithComments {
@Embedded
public Post post;
@Relation(parentColumn = "id", entityColumn = "post_id", entity = Comment.class)
public List<Comment> comments;
}
Я хотел бы получить все сообщения, у которых есть комментарий с status = approved
, ноЯ не совсем уверен, как комната справляется с этим.Я попробовал следующее:
@Dao
public interface PostDao {
@Query("SELECT * FROM post INNER JOIN comment ON post.id = comment.post_id WHERE comment.status = 'approved'")
List<PostWithComments> getPostWithComments();
}
Я получил дубликаты в результатах.Каждый пост присутствует несколько раз в результатах List<PostWithComments>
.
Обновление:
После прочтения сгенерированного кода на PostDao_Impl.java
кажется, что Room выполняет подзапросчтобы получить отношения.
Сначала он выполняет запрос в аннотации @Query
из метода getPostWithComments
, а затем генерирует подзапрос для отношения для заполнения List<Comment>
SELECT id, post_id, title, content FROM comment WHERE post_id IN (
икакая-то другая логика, и, похоже, нет способа изменить сгенерированный подзапрос.
Есть ли другой способ сделать это?