MyBatisPlus queries json type data and adds conditions

If you use MyBatisPlus to query json type data and need to add conditions, you can do so by using the Lambda expression provided by MyBatisPlus in the query conditions. Suppose you have a table userwith a infojson column named and you want to query infofor agerecords greater than 18. You can follow these steps:

  1. UserDefine a property in the entity class infoand use @TableFieldannotations to map it to a column in the database table info:
在User实体类中定义一个info属性,并使用@TableField注解将其映射到数据库表中的info列:
kotlin
Copy code
public class User {
    @TableField("info")
    private String info;

    // 省略其他属性和方法
}
使用QueryWrapper对象创建查询条件,并在Lambda表达式中使用JSON_EXTRACT函数提取info中的age属性进行比较:
arduino
Copy code
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.lambda().apply("JSON_EXTRACT(info, '$.age') > {0}", 18);
在这个例子中,JSON_EXTRACT(info, '$.age')表示从info中提取age属性的值,18表示比较的值。使用apply方法将这个表达式添加到查询条件中。

最后,你可以通过调用selectList等方法执行查询:

mathematica
Copy code
List<User> userList = userMapper.selectList(queryWrapper);
这将返回符合条件的User对象列表。




[email protected]
多举几个查询条件的例子
当使用MyBatisPlus查询JSON类型的数据时,你可以使用Lambda表达式构建各种查询条件。以下是一些示例:

查询包含指定字符串的记录
假设你有一个名为user的表,其中包含一个名为info的JSON类型的列。你可以使用like函数查询包含指定字符串的记录:

sql
Copy code
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.lambda().like("info", "%指定字符串%");
List<User> userList = userMapper.selectList(queryWrapper);
查询嵌套的JSON属性
假设你的info列包含一个嵌套的JSON对象,其中包含name和age两个属性。你可以使用JSON_EXTRACT函数查询这些属性:

arduino
Copy code
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.lambda().apply("JSON_EXTRACT(info, '$.name') = {0}", "John");
queryWrapper.lambda().apply("JSON_EXTRACT(info, '$.age') > {0}", 18);
List<User> userList = userMapper.selectList(queryWrapper);
在这个例子中,我们查询name等于"John"且age大于18的记录。

查询数组类型的JSON属性
假设你的info列包含一个数组类型的JSON属性,你可以使用JSON_CONTAINS函数查询包含指定元素的记录:

swift
Copy code
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.lambda().apply("JSON_CONTAINS(info, {0})", "\"apple\"");
List<User> userList = userMapper.selectList(queryWrapper);
在这个例子中,我们查询info中包含元素"apple"的记录。

这些只是一些示例,你可以使用各种函数和运算符来构建各种复杂的查询条件。




[email protected]
如果是JSON层级特别深的 话,如何查询
如果你的JSON层级非常深,你可以使用MyBatis-Plus提供的JSON_EXTRACT函数来查询嵌套在JSON中的属性。JSON_EXTRACT函数可以从JSON字符串中提取指定路径的属性值。

例如,假设你有一个名为user的表,其中包含一个名为info的JSON类型的列,而info包含多个嵌套的属性,如下所示:

json
Copy code
{
  "name": "John",
  "age": 25,
  "address": {
    "street": "123 Main St",
    "city": "New York",
    "state": "NY",
    "zip": "10001",
    "country": "USA"
  },
  "phone": [
    {
      "type": "home",
      "number": "555-1234"
    },
    {
      "type": "work",
      "number": "555-5678"
    }
  ]
}
如果你想查询info中的address.city属性,你可以使用以下代码:

sql
Copy code
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.lambda().apply("JSON_EXTRACT(info, '$.address.city') = {0}", "New York");
List<User> userList = userMapper.selectList(queryWrapper);
在这个例子中,我们使用JSON_EXTRACT函数从info列中提取address.city属性的值,并将其与"New York"进行比较。请注意,我们在表达式中使用了单引号和双引号来转义JSON路径和字符串值。

如果你需要查询嵌套更深的属性,你可以通过在JSON路径中添加更多的.或[]来实现。例如,如果你想查询info中的第一个电话号码的类型为home的记录,你可以使用以下代码:

sql
Copy code
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.lambda().apply("JSON_EXTRACT(info, '$.phone[0].type') = {0}", "home");
List<User> userList = userMapper.selectList(queryWrapper);
在这个例子中,我们在JSON路径中使用了[0]来获取数组中的第一个元素,然后使用.来获取该元素的type属性。

Guess you like

Origin blog.csdn.net/heihei_100/article/details/130067535