gpt4 book ai didi

mysql - 参数 2 中的 JSON 文本无效 - 使用 Spring JPA 的 json_contains

转载 作者:行者123 更新时间:2023-11-29 09:58:41 24 4
gpt4 key购买 nike

在我的表项目中有一个名为 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 呢?

最佳答案

您的实现存在两个问题:

  • SQL查询末尾有一个额外的括号),看看日志是怎么说的。相反,您应该按如下方式编写:

    @Query(value = "select * from items where json_contains(tags, ?1)", nativeQuery = true)
  • 完成此操作后,您还需要将方法参数(您的查询变量)括在双引号内,以与您在 MySQL 命令行控制台中尝试的内容完全匹配。因此,您将按如下方式调用该方法:

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

替代解决方案

您可以使用Spring Data Specifications API以避免 native 查询。

因此,您可以执行以下操作:

@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));

关于mysql - 参数 2 中的 JSON 文本无效 - 使用 Spring JPA 的 json_contains,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53412879/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com