如何使用选择字段执行Room DAO多表联接@Query?

时间:2020-01-14 16:26:20

标签: android android-sqlite android-room

我的问题: 我正在努力消除Room DAO中以下Room @Query语句的编译错误。如您所见,SQLite查询语句正在连接来自不同表的各个字段。错误所标识的缺失字段是该方法的列表类型中所标识的Notes类构造函数的一部分。我想我需要更改所标识的列表类型。如果我是对的,我需要一些有关如何解决该问题的指导/建议。我是否只需要查询那些特定的字段就可以创建一个新的类和DAO?也许只是一个类,因为没有仅特定于这些字段的表。错误是:

错误:查询返回的列在com.mistywillow.researchdb.database.entities中没有字段[commentID,questionID,quoteID,termID,topicID,deleted]。即使将其注释为非null,也请注意。或原始的。查询返回的列:[NoteID,SourceID,SourceType,Title,Summary] 列出getNotesOnTopic(String topic);

@Query("SELECT n.NoteID, s.SourceID, s.SourceType, s.Title, c.Summary FROM Comments as c " +
        "LEFT JOIN Notes as n ON n.CommentID = c.CommentID " +
        "LEFT JOIN Sources as s ON n.SourceID = s.SourceID " +
        "LEFT JOIN Topics as t ON n.TopicID = t.TopicID WHERE t.Topic = :topic AND n.Deleted = 0")
List<Notes> getNotesOnTopic(String topic);

我要做什么: 我正在尝试使用嵌入式SQLite数据库转换现有Java桌面应用程序。上面的查询在该应用中确实可以正常工作。我只想传递这些表中的字段数据。

我尝试过的事情: 最近几天,我做了一些谷歌搜索,并访问了一些论坛(例如Android论坛,Developer.Android.com),但是大多数Room @Query示例都是单表全字段查询(例如“ Select * From table”)。我还没有发现(可能有些东西)完全解决了在联接和查询表中的特定字段时如何以及如何做。

1 个答案:

答案 0 :(得分:1)

我想我可能已经解决了我的问题。我刚刚创建了一个名为SourceTable的新类,并在构造函数中指定了查询的字段。根据后续错误,唯一的麻烦是我是参数必须与字段名称匹配。

public class SourcesTable {
    private int NoteID;
    private int SourceID;
    private String SourceType;
    private String Title;
    private String Summary;

    public SourcesTable(int NoteID, int SourceID, String SourceType, String Title, String Summary){
        this.NoteID = NoteID;
        this.SourceID = SourceID;
        this.SourceType = SourceType;
        this.Title = Title;
        this.Summary = Summary;
    }
}

然后更新我的列表方法:

List<SourcesTable> getNotesOnTopic(String topic);