Spring JPA是否提供了一种方法来了解项目列表的至少一个元素是否匹配另一个项目列表中的一个元素?

发布于 2025-02-04 14:54:33 字数 1780 浏览 2 评论 0原文

Spring Data JPA是否提供了一个查询关键字,以检查列表中至少包含的一项是否匹配了另一个列表中包含的项目之一。

这是我的查询:(***应该是我要寻找的关键字。例如:包含,在...但是我不知道哪一个是正确的。)

Page<ActivityEntity> findAllByHashtags***AndDateIsGreaterThanEqual(List<HashtagEntity> hashtags, LocalDateTime date, Pageable pageable);

更多信息:这是我的活动实体。

public class ActivityEntity {
    @Id
    @GeneratedValue
    private Long id;

    private String name;

    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm a z")
    private LocalDateTime date;


    @ManyToMany(cascade=CascadeType.ALL)
    @Cascade({org.hibernate.annotations.CascadeType.DELETE,  org.hibernate.annotations.CascadeType.REMOVE})
    private List<HashtagEntity> hashtags;
}


我想检索每个主题标签至少匹配列表中包含的主题标签的每个活动。

例如 : 鉴于数据库中包含的活动:

[
 {
  "id": 1,
  "name": "Karaoke time",
  "date": "2022-05-28T12:30:00Z",
  "hashtags": 
   [
    { "name": "fun" }, { "name": "karaoke"}, { "name": "friend" }
   ]
 },
 {
  "id": 2,
  "name": "Just Dance Session V.1",
  "date": "2022-05-28T12:30:00Z",
  "hashtags": 
   [
    { "name": "fun" }, { "name": "dance"}
   ]
 }
]

如果我提供以下主题标签列表:

[
 { "name": "karaoke" }, { "name": "heavy metal"}
]

我应该收到:

[
 {
  "id": 1,
  "name": "Karaoke time",
  "date": "2022-05-28T12:30:00Z",
  "hashtags": 
   [
    { "name": "fun" }, { "name": "karaoke"}, { "name": "friend }
   ]
 }
]

我看到有关该主题的另一篇文章: spring jpa查询检查是否在参数列表中至少存在列表的至少一个元素

但是我想避免使用此解决方案,因为这需要进行额外的昂贵查询。

Does Spring Data JPA provide a query keyword to check if at least one item contained in a list match at least one of the items contained in another list.

Here's my query : (*** should be the keyword I'm looking for. Ex : contains, in , ... but I don't know which one is the right one.)

Page<ActivityEntity> findAllByHashtags***AndDateIsGreaterThanEqual(List<HashtagEntity> hashtags, LocalDateTime date, Pageable pageable);

Some more information : Here's my Activity entity.

public class ActivityEntity {
    @Id
    @GeneratedValue
    private Long id;

    private String name;

    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm a z")
    private LocalDateTime date;


    @ManyToMany(cascade=CascadeType.ALL)
    @Cascade({org.hibernate.annotations.CascadeType.DELETE,  org.hibernate.annotations.CascadeType.REMOVE})
    private List<HashtagEntity> hashtags;
}


I'd like to retrieve every activity whom hashtags match at least one of the hashtags contained in a list.

For example :
Given the activities contained in the database :

[
 {
  "id": 1,
  "name": "Karaoke time",
  "date": "2022-05-28T12:30:00Z",
  "hashtags": 
   [
    { "name": "fun" }, { "name": "karaoke"}, { "name": "friend" }
   ]
 },
 {
  "id": 2,
  "name": "Just Dance Session V.1",
  "date": "2022-05-28T12:30:00Z",
  "hashtags": 
   [
    { "name": "fun" }, { "name": "dance"}
   ]
 }
]

If I provide the following hashtags list :

[
 { "name": "karaoke" }, { "name": "heavy metal"}
]

I should receive :

[
 {
  "id": 1,
  "name": "Karaoke time",
  "date": "2022-05-28T12:30:00Z",
  "hashtags": 
   [
    { "name": "fun" }, { "name": "karaoke"}, { "name": "friend }
   ]
 }
]

I see there is another post on the subject : Spring JPA Query Check If At Least One Element of a List Exists in Parameter List

But I'd like to avoid this solution because this would require to make an additional costly query.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

浅笑依然 2025-02-11 14:54:33

我实际上设法找到了一个解决方案:
关键字“在”中适用于我想要的!

Page<ActivityEntity> findAllByHashtagsInAndDateIsGreaterThanEqual(List<HashtagEntity> hashtags, LocalDateTime date, Pageable pageable);

I actually managed to find a solution :
The keyword "IN" works for what I want !

Page<ActivityEntity> findAllByHashtagsInAndDateIsGreaterThanEqual(List<HashtagEntity> hashtags, LocalDateTime date, Pageable pageable);
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文