У меня есть атрибут коллекции объекта.Мне нужно найти в базе данных все записи, которые содержат эту строку.Как полное совпадение "LIKE (% KEYWORD%)";
Page<Article> findByCategoryIdsContains(String categoryId, Pageable pageable);
Но я получил эту ошибку ниже:
nested exception is java.lang.IllegalArgumentException:
unknown collection expression type[org.hibernate.query.criteria.internal.path.SingularAttributePath]
Я пробовал по-разному.
Этот код работает нормально:
@Query(value = "SELECT * FROM cms_article WHERE category_ids LIKE %?1%", nativeQuery = true)
Page<Article> findByCategoryIdsLike(String categoryId, Pageable pageable);
Но этот код выдает ошибку:
Page<Article> findByCategoryIdsContains(String categoryId, Pageable pageable);
Каков правильный метод запроса ключевого слова?
Вот код, например:
Базовый объект:
@Data
@MappedSuperclass
public class BaseEntity implements Serializable {
@Transient
private static final long serialVersionUID = 1L;
@Id
@Column(columnDefinition = "char(24) comment 'Primary key ID'")
protected String id;
@CreatedDate
@Temporal(TemporalType.TIMESTAMP)
@Column(name = "created_time", nullable = false, columnDefinition = "timestamp default current_timestamp comment 'Creation time'")
protected Date createdTime;
@LastModifiedDate
@Temporal(TemporalType.TIMESTAMP)
@Column(name = "last_modified_time", nullable = false, columnDefinition = "timestamp default current_timestamp comment 'Last updateed time'")
protected Date lastModifiedTime;
}
Элемент статьи:
@Data
@Entity
@Table(name = "cms_article")
@org.hibernate.annotations.Table(appliesTo = "cms_article", comment = "Article information table")
@EqualsAndHashCode(callSuper = true)
public class Article extends BaseEntity {
@Column(columnDefinition = "varchar(120) comment 'Article title'")
private String title;
@Column(columnDefinition = "varchar(24) comment 'Article author'")
private String author;
@Convert(converter = JpaJsonConverter.class)
@Column(name = "cover_urls", columnDefinition = "varchar(255) comment 'Article covers'")
private List<String> coverUrls;
@Column(columnDefinition = "mediumtext comment 'Article content'")
private String content;
@Convert(converter = JpaJsonConverter.class)
@Column(name = "category_ids", columnDefinition = "varchar(255) comment 'Article category ids'")
private List<String> categoryIds;
}
Мой преобразователь пользовательских атрибутов для объекта в строку json:
public class JpaJsonConverter implements AttributeConverter<Object, String> {
@Override
public String convertToDatabaseColumn(Object object) {
return JSON.toJSONString(object);
}
@Override
public Object convertToEntityAttribute(String dbData) {
return JSON.parse(dbData);
}
}
Репозиторий JPA:
public interface ArticleRepository extends JpaRepository<Article, String> {
/**
* Get article page by category id.
*
* @param categoryId category id
* @param pageable page information
* @return Article page
*/
Page<Article> findByCategoryIdsContains(String categoryId, Pageable pageable);
/**
* Get article page by category id.
*
* @param categoryId category id
* @param pageable page information
* @return Article page
*/
@Query(value = "SELECT * FROM cms_article WHERE category_ids LIKE %?1%", nativeQuery = true)
Page<Article> findByCategoryIdsLike(String categoryId, Pageable pageable);
}
Вот записи базы данных: