项有一个名为tag的json列。保留类似[“ tag1”,“ tag2”]的数据。
我想从具有给定标签的表过滤器中进行选择。
在mysql命令行中,json_contains有效。
select * from items where json_contains(tags, '"tag1"');
但是我如何在Spring JPA中使用它?
@Query(value = "select * from items where json_contains(tags, ?1))", nativeQuery = true)
Page<ItemDO> list(String query, Pageable pageable);
遇到错误
TRACE 21469 --- [ main] o.h.type.descriptor.sql.BasicBinder : binding parameter [1] as [VARCHAR] - [desc]
WARN 21469 --- [ main] o.h.engine.jdbc.spi.SqlExceptionHelper : SQL Error: 1064, SQLState: 42000
ERROR 21469 --- [ main] o.h.engine.jdbc.spi.SqlExceptionHelper : You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ') limit 10' at line 1
那么我如何在Spring JPA中使用json_contains?
答案 0 :(得分:0)
实施中存在两个问题:
SQL查询末尾有一个额外的括号),看看日志说了什么。相反,您应该将其编写如下:
@Query(value = "select * from items where json_contains(tags, ?1)", nativeQuery = true)
已完成此操作,还需要将方法参数(您的查询变量)包装在双引号中,以与您在MySQL命令行控制台中尝试的内容完全匹配。因此,您将按以下方式调用该方法:
yourRepository.list("\"tag1\"", PageRequest.of(,10) );
替代解决方案
您可以使用Spring Data Specifications 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));