是否有 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 传递的实体子集?的主要内容,如果未能解决你的问题,请参考以下文章