@thatmaniscool

Как сделать выборку по Set в spring boot?

Имеется класс для хранения тегов к определенной статье:
@Entity
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
@ToString
public class Tags {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int id;
    @Column(nullable = false, length = 255)
    private String tag;
}

И собственно сам контент-класс, которые реализует set интерфейс:
@Entity
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
@ToString
public class ContentDB {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int id;
    @Column(nullable = false, length = 255)
    private String title;
    @Lob
    @Column(nullable = false)
    private String description;
    @Lob
    @Column(nullable = false)
    private String content;
    private boolean publicContent;
    @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER, orphanRemoval = true)
    @JoinColumn(name = "content_id", nullable = false)
    private Set<Tags> tagsSet;
    @Column(nullable = false, length = 255)
    private String user;
    @Column(nullable = false)
    private Date date;
}

Реализую crud интерфейс:
@Repository
public interface ContentRepository extends CrudRepository<ContentDB, Integer> {
    public Optional<ContentDB> findContentDBById(final int id);

//  Этот метод не работает.
    public Optional<List<ContentDB>> findContentDBByTagsSet(final String tag);
    
//    Тоже не работает.
    @Query("select c from ContentDB  c where c.tagsSet = :tag")
    public Optional<List<ContentDB>> findAllByTag (final String tag);
}


@SpringBootTest
public class ContentDBTest {
    private int id = 1;
    @Autowired
    private ContentService contentService;

    // Работает великолепно!
    @Test
    public void findContentById() {
        ContentDB contentDB = contentService.findContentById(id);
        Assertions.assertNotNull(contentDB, "The content class is null!");
    }

    // Работает великолепно!
    @Test
    public void extractTagsSetFromContent() {
        ContentDB contentDB = contentService.findContentById(id);
        Set<Tags> tagsSet = contentDB.getTagsSet();
        Assertions.assertNotNull(tagsSet, "TagsSet is null!");
        Assertions.assertNotEquals(0, tagsSet.size(), "The size of set<Tags> is 0!");
    }

    //Не работает!
    @Test
    public void findContentByTag (){
        String tag = "outlook";
        List<ContentDB> contentDBS = contentService.findAllByTag(tag);
        Assertions.assertNotNull(contentDBS, "Content list is null!");
    }
}


Собственно как найти весь контент по определенному тегу?
  • Вопрос задан
  • 66 просмотров
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы