Есть две проблемы с вашей реализацией:
Там, в качестве дополнительной скобки в конце запроса SQL), посмотрите, что говорят журналы.Вместо этого вы должны написать это следующим образом:
@Query(value = "select * from items where json_contains(tags, ?1)", nativeQuery = true)
Сделав это, вам также необходимо заключить параметр метода (переменную вашего запроса) в двойные кавычки, чтобы точно соответствовать тому, что выпробовал в консоли командной строки MySQL.Таким образом, вы будете вызывать метод следующим образом:
yourRepository.list("\"tag1\"", PageRequest.of(,10) );
Альтернативное решение
Вы можете использовать API данных Spring Data API чтобы избежать нативных запросов.
Таким образом, вы можете сделать следующее:
@Repository
public interface ItemRepository extends JpaRepository<ItemDao, Integer> , JpaSpecificationExecutor<ItemDao> {
default Page<ItemDao> findItemsByJsonTagValue(String jsonTagValue, Pageable pageable){
return findAll((root, query, builder) -> {
final String CONTAINS_FUNCTION = "JSON_CONTAINS";
final String JSON_COLUMN_NAME = "tags" ;
final int TRUE_BIT = 1;
return builder.equal(
builder.function(
CONTAINS_FUNCTION,
String.class,
root.<String>get(JSON_COLUMN_NAME),
builder.literal(String.format("\"%s\"", jsonTagValue))),TRUE_BIT);
}, pageable);
}
}
И затем где-нибудь в своем коде вы вызовете метод следующим образом:
itemRepository.findItemsByJsonTagValue("tag1", PageRequest.of(0 ,10));