查询 Room 中对象的类型转换列表

Ezz*_*zzy 5 sqlite android android-room

我有一张看起来像下面的表格

@Entity
@JsonIgnoreProperties(ignoreUnknown = true)
public class Product
{
    @PrimaryKey
    @ColumnInfo(name = "ID")
    @JsonProperty("ID")
    public int id;

    @ColumnInfo(name = "Name")
    @JsonProperty("Name")
    public String name;

    @ColumnInfo(name = "Documents")
    @JsonProperty("Documents")
    @TypeConverters(DocumentConverter.class)
    public List<Document> documents;
}
Run Code Online (Sandbox Code Playgroud)

//...

@TypeConverters(DocumentConverter.class)
@JsonIgnoreProperties( ignoreUnknown = true )
@JsonTypeName("Documents")
public class Document
{
    @JsonProperty("Name")
    public String name;

    @JsonProperty("URL")
    public String url;
}
Run Code Online (Sandbox Code Playgroud)

我可以通过执行这样的操作来根据名称检索产品

@Query("SELECT * FROM Product WHERE Name = :name")
List<Product> getProducts(String name);
Run Code Online (Sandbox Code Playgroud)

然后我就可以从每个 Product 对象访问文档列表。但是,我也想只处理具有某些文件的产品。我可以通过上面的查询获取所有产品,然后手动过滤我想要的文档,但是当我只查找非常具体的文档时会变得非常痛苦。

是否也可以基于 Document 变量进行查询而不是单独的表?

就像是...

@Query("SELECT * FROM Product WHERE Name = :name AND Document.name = :documentName")
List<Product> getProducts(String name, String documentName);
Run Code Online (Sandbox Code Playgroud)

谢谢。

And*_*dov 0

您可以使用 LIKE sql 语句在 json 列中搜索转换后的文档列表。示例:假设我们已将文档转换为如下形式以存储在数据库中:

{
    name: "Title",
    url: "Your_url"
}
Run Code Online (Sandbox Code Playgroud)

因此,您对列表中包含此类文档的产品的查询应该如下所示:

SELECT * FROM Product WHERE Name = :name AND Documents LIKE :documentLikeExpr
Run Code Online (Sandbox Code Playgroud)

在哪里

String documentLikeExpr = "%name: \"Title\"%";
Run Code Online (Sandbox Code Playgroud)

表达式中的%表示零个、一个或多个字符。

因此,我们在这里做的唯一一件事是使用 SQL 语言功能搜索列内字符串的一部分。

  • 确切地。这不是最佳的,也不够快。但是您要求一种没有此方法的解决方法 - 所以这是您要求的一个选项。) (2认同)