【问题标题】:Spring Data JPA. Choose all posts that contain tags弹簧数据 JPA。选择所有包含标签的帖子
【发布时间】:2015-05-10 15:53:13
【问题描述】:

我使用 Spring Data。我有以下实体:

@Entity
class Post {
    @Id
    private Long id;
    private String message;

    @ManyToMany
    @JoinTable(name = "POST_TAG", joinColumns = {
            @JoinColumn(name = "POST_ID", referencedColumnName = "ID"),
            @JoinColumn(name = "TAG_ID", referencedColumnName = "ID")
    })
    private Set<Tag> tags;
}

@Entity
class Tag {
    @Id
    private Long id;
    private String name;
}

在 PostRepository 中我想要 2 个方法,其中:

  • 查找包含至少一个(或多个)指定标签的所有帖子。
  • 查找包含所有指定标签的所有帖子。

类似:

List<Post> findByTagsContainsAnyOf(List<String> tags);
List<Post> findByTagsContainsAll(List<String> tags);

【问题讨论】:

    标签: sql many-to-many spring-data spring-data-jpa


    【解决方案1】:

    第一个很简单 - List&lt;Post&gt; findByTagsIn(List&lt;Tag&gt; tags)。请注意,它是List&lt;Tag&gt; 而不是List&lt;String&gt;,因为它是映射到Post 而不是StringTag。如果您想坚持使用List&lt;String&gt;,则必须使用@Query@Query("SELECT p FROM Post p WHERE p.tags CONTAINS (SELECT t FROM Tag t WHERE t.name IN :tags)") 之类的东西应该可以工作。

    第二个必须通过@QueryPostTag 实体之间建立连接来完成。

    一般来说,JPA 只是基于 SQL 的面向对象的 API。因此,如有疑问,请创建 SQL,然后将其转换为等效的 JPQL。在 JPQL 简单明了的地方,可以将其编码为方法名,依靠 Spring Data 查询创建框架从方法名生成 JPQL。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多