Как найти все совпадения по атрибуту коллекции, используя данные весны jpa? - PullRequest
0 голосов
/ 11 июня 2019

У меня есть атрибут коллекции объекта.Мне нужно найти в базе данных все записи, которые содержат эту строку.Как полное совпадение "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);

}

Вот записи базы данных: enter image description here

Ответы [ 3 ]

1 голос
/ 11 июня 2019

Попробуйте метод findByCategoryContainedIgnoreCase вместо findByCategoryIdsLike

@Query("Select cmsa from cms_article cmsa where cmsa.category_ids LIKE  %?1%")
Page<Article> findByCategoryContainingIgnoreCase(String categoryId);

без @Query, попробуйте ниже.

Page<Article> findByCategoryIgnoreCaseContaining(String categoryId);
0 голосов
/ 13 июня 2019

Попробуйте это

Page<Article> findByCategoryContaining(String categoryId);

Указанный документ нажмите

Проверьте содержание в вышеупомянутом документе

Таблица 3. Поддерживаемые ключевые слова в именах методов

0 голосов
/ 11 июня 2019

Попробуйте следующим образом:

Page<Article> findByCategoryIdsContainingIgnoreCase(String categoryId, Pageable p);

Возможно, стоит подумать о том, чтобы не добавлять идентификаторы в базу данных таким образом.Вы можете иметь отдельную таблицу, соответствующую categoryId articleId.Тогда у вас будет строка для каждой категории, принадлежащей статье.

, то есть:

articleId | categoryId
    1     |     1
    1     |     2    
    2     |     1
    2     |     3
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...