参数2中的json文本无效-json_使用spring jpa包含

hrysbysz  于 2021-06-19  发布在  Mysql
关注(0)|答案(1)|浏览(430)

在我的表中,items有一个名为tag的json列。保留类似[“tag1”,“tag2”]的数据。
我想从这个表中选择带有给定标签的过滤器。
在mysql命令行中,json包含works。

select * from items where json_contains(tags, '"tag1"');

但是如何在springjpa中使用它呢?

@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\u-contains呢?

jslywgbw

jslywgbw1#

您的实现有两个问题:
在sql查询的末尾有一个额外的圆括号),看看日志是怎么说的。相反,你应该这样写:

@Query(value = "select * from items where json_contains(tags, ?1)", nativeQuery = true)

这样做之后,您还需要将method参数(您的查询变量) Package 在双引号中,以便与您在mysql命令行控制台中尝试的完全匹配。因此,您将按如下方式调用该方法:

yourRepository.list("\"tag1\"", PageRequest.of(,10) );

替代解决方案
您可以使用spring数据规范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));

相关问题