簡體   English   中英

是否有 JPA/JPQL 查詢來搜索在 spring 中作為 JSON 傳遞的實體子集?

[英]Is there a JPA / JPQL query to search for a subset of entities passed as JSON in spring?

我在 spring 中定義了兩個實體,我想查詢包含給定標簽列表作為子集的帖子。

我的兩個實體看起來像

public class Post {
     private @Id Integer id;
     private @Column String text;
     private @OneToMany List<Tag> tags;
}

public class Tag {
    private @Id Integer id;
    private @Column String key;
    private @Column String value;
    private @ManyToOne Post post;
}

我嘗試實現一個查詢來搜索包含一組標簽的帖子,例如

@Query("SELECT pst FROM Post pst JOIN pst.tags tgs WHERE :tags MEMBER OF pst.tags")
List<Post> findByTags(@Param("tags") Tag[] tags);

並稱之為 URL/tags/search/findByTags?tags=[{"key":"test","value":"test"}]

我的第一個問題是我無法讓它接受標簽內容而不是標簽 ID,所以我試圖像這個查詢一樣解決它

@Query("SELECT post FROM Post pst JOIN post.tags WHERE (SELECT tg from Tag tg WHERE tg.key = :key AND tg.value = :value) MEMBER OF post.tag")
List<Post> findByTags(@Param("key") String key, @Param("value") String value);

並稱其為 URL/tags/search/findByTags?key=test&value=test 這讓我遇到了以下錯誤

標量子查詢包含多於一行

有沒有辦法解決這兩個要求? 能夠通過具有任何值的鍵找到包含標簽的所有帖子將是一個獎勵。

編輯以澄清:

想象一下,我有兩個帖子,我將把它們繪制為 JSON,包括標簽的關系。

[
    {
        id: 1,
        text: "text1",
        tags: [
            {
                id: 1,
                key: "key1",
                value: "value1",
            },
            {
                id: 2,
                key: "key2",
                value: "value2",
            },
            {
                id: 3,
                key: "key3",
                value: "value3",
            },
        ],
    },
    {
        id: 2,
        text: "text2",
        tags: [
            {
                id: 4,
                key: "key1",
                value: "value1",
            },
            {
                id: 5,
                key: "key2",
                value: "value2",
            },
        ],
    },
]

我想用包含標簽信息的 JSON 查詢帖子:

[
    {
        key: "key1",
        value: "value1",
    },
    {
        key: "key2",
        value: "value2",
    }
]

因此,我有必要查詢描述帖子中標簽子集的標簽信息,例如多個鍵和值對,而無需在查詢中指定我將擁有多少參數,作為獎勵,這會很好通過使用 JSON 作為參數來完成所有這些。 所以對於上面的查詢,我會得到一個包含兩個帖子的答案。

如果您希望按標簽和值顯示所有帖子,您可以嘗試以下操作:

@Query("SELECT pst FROM Post pst JOIN pst.tags tgs WHERE tags.key = :key AND tags.value = :value")
List<Post> findByTags(@Param("key") String key, @Param("value") String value);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM