Комната с использованием аннотации @Relation - отношение один ко многим, где предложение дочерние отношения - PullRequest
0 голосов
/ 31 мая 2019

Использование аннотации @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 ( икакая-то другая логика, и, похоже, нет способа изменить сгенерированный подзапрос.

Есть ли другой способ сделать это?

Ответы [ 2 ]

1 голос
/ 04 июня 2019

С @Relation вы можете использовать @ DatabaseView

@DatabaseView("SELECT * FROM comments WHERE status = 'approved'")
public class ApprovedComment {
  @Embedded
  Comment comment;
}

Класс PostWithComments

public class PostWithComments {
    @Embedded
    public Post post;

    @Relation(parentColumn = "id", entityColumn = "post_id", entity = ApprovedComment.class)
    public List<ApprovedComment> comments;

}

DAO

@Dao
public interface PostWithCommentsDao {
       @Query("SELECT * FROM post")
       List<PostWithComments> getPostWithComments();
}

Вам также необходимо обновить класс Database, который расширяет RoomDatabase, и вам может потребоваться обновить версию.

@Database(entities = {Post.class, Comment.class}, views = {ApprovedComment.class}, version = 1)
public abstract class MyDatabase extends RoomDatabase
0 голосов
/ 31 мая 2019

Не проверено, но вы можете попробовать это ...

public class PostWithComments {
    @Embedded
    public Post post;

    @Embedded
    public Comment comment;
}



@Dao
public interface PostWithCommentsDao {
       @Query("SELECT post.*, comment.* FROM post LEFT JOIN comment ON post.id=comment.post_id where comment.status = 'approved'")
       List<PostWithComments> getPostWithComments();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...