记一次 JPA 和 Json 相关查询问题

以前自己写代码解析 Json 都是用 map,这次尝试了下 Jackson,结果出问题了。

TL;DR

这是个很弱智的问题,而且弱智的我被这个问题困扰了一天:

如果你使用 Jackson 解析 json,那么要小心引号。使用 JsonNode.get().asText() 而不是 JsonNode.get().toString()

细节

前端传 json 大致如下:

1
2
3
4
5
6
7
8
9
{
	"title": "二手 NS",
	"description": "description",
	"originPrice": 2600,
	"salePrice": 1999,
	"deliveryPrice": 0,
	"userId": 30,
	"category": "手机数码"
}

实体类 Category 属性简要如下:

1
2
3
4
5
6
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
int id;
@Column(name = "name")
String name;

我的问题:后端要根据传来的 category 字段查询这个分类的信息,我的代码如下:

使用 jackson 解析 json:

1
2
3
JsonNode inputInfo = new ObjectMapper().readTree(inJson);
String categoryName = inputInfo.get("category").toString();
Category category = categoryService.getCategoryByName(categoryName);

CategoryService:

1
2
3
4
public Category getCategoryByName(String categoryName) {
        // xxxx
        return categoryDAO.findByName(categoryName);
}

dao 简单使用 JPA 查询查不到:

1
List<Category> findByName(String name);

手写 SQL 查询也查不到:

1
2
@Query(value = "select * from category_ c where c.name = ?1", nativeQuery = true)
Category findByName(String name);

然后我把 spring 配置改成显示 SQL 语句:

1
2
jpa:
  show-sql: true

运行时执行的 SQL 语句如下:

1
Hibernate: select category0_.id as id1_0_, category0_.name as name2_0_ from category_ category0_ where category0_.name=?

正常且符合逻辑的查询,把这串 SQL 手动执行了下,能正常查出结果:

1
select category0_.id as id1_0_, category0_.name as name2_0_ from category_ category0_ where category0_.name='手机数码'

那么...是不是 getCategoryByName() 方法传入的字符串出了问题?在这个方法里打印一下日志看看:

2020-04-14 12:16:54.279  WARN 10996 --- [nio-8383-exec-1] x.b.c.service.CategoryService            : "手机数码"

hmmm 这个分类名多了个双引号包裹,因为这个双引号造成了查不出结果...这就是 Jackson 使用相关的一些细节。

我原来从 json 取值的写法是:

1
String categoryName = inputInfo.get("category").toString();

那么这里的 categoryName 就是带双引号的,而想要预期效果,要使用 asText() 方法:

1
String categoryName = inputInfo.get("category").asText();
updatedupdated2020-05-112020-05-11
加载评论