是否有 JPA / JPQL 查询来搜索春季作为 JSON 传递的实体子集?

Posted

技术标签:

【中文标题】是否有 JPA / JPQL 查询来搜索春季作为 JSON 传递的实体子集?【英文标题】:Is there a JPA / JPQL query to search for a subset of entities passed as JSON in spring? 【发布时间】:2021-09-08 04:52:14 【问题描述】:

我在 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 作为参数来完成所有这一切会很好。所以对于上面的查询,我会得到一个包含两个帖子的答案。

【问题讨论】:

【参考方案1】:

如果您希望所有帖子都按标签和价值,您可以试试这个:

@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);

【讨论】:

谢谢,但我的情况是这个解决方案不起作用,因为我只能在这里选择一个键/值对。如果我使用 AND 向此查询添加更多参数,则不会产生任何结果,并且如果我通过 OR 添加它们,则返回仅包含一个键/值对的帖子,但我需要包含所有这些参数的那些。我编辑了我的问题以澄清这一点。 您最好的选择是使用标准 api。你基本上需要像key = 'key1' and value ='value1' or key = 'key2' and value = 'value2' 这样的东西,你可以添加更多的键/值对。密切关注性能,此类查询难以使用索引。 或者你可以多次调用这个方法并合并结果。

以上是关于是否有 JPA / JPQL 查询来搜索春季作为 JSON 传递的实体子集?的主要内容,如果未能解决你的问题,请参考以下文章

Spring jpa jpql查询

JPA JPQL 怎么判断某个字段是不是为空

在 JPQL 中可以选择 EXISTS() 吗?

JPQL 中带有 JPA 的本机查询的“GROUP_CONCAT”是不是有替代方案?

JPA JPQL简介

没有 JPQL 查询的 Spring-data-jpa 中的 CURRENT_DATE