场景:
java ebean,把一个List用mysql中的json格式存储,然后要查询这个json字段是否包含某个元素。
PS:如果存储的不是List,而是实体类或者Map,则使用jsonEqualTo()方法来查询,具体请参考:
java ebean 用jsonEqualTo 查询mysql的json字段
废话不多说,直接上代码:
存储时:
public class Task {
// @DbJson直接将List转成mysql中的json字段存储
@DbJson
@Column(name = "owners")
private List<String> owners;
// 其它字段。。。。。。
}
查询时:
ExpressionList<Task> expressionList = db.find(Task.class).where();
// json字段owners存储形式:["owner1","owner2"],sql语句形式:where JSON_CONTAINS(owners, CONCAT('"owner1"')),双引号需要转义
String str = "'\"".concat("要查询的元素").concat("\"'"); //
expressionList.raw(String.format("JSON_CONTAINS(owners, CONCAT(%s))", str));
return expressionList.eq("deleted", 0)
.orderBy()
.desc("id")
.findList();
原理:
- mysql支持JSON_CONTAINS来对json字段进行查询:
select * from taskwhere JSON_CONTAINS(owners, CONCAT('"要查询的关键词"'));
- json字段owners存储形式:[“owner1”,“owner2”],每一个元素都有双引号,所以查询时要带双引号。另外双引号外面再带一个单引号,用于标识是字符串(两者反过来不行):
JSON_CONTAINS(owners, CONCAT('"owner1"'))
- 双引号在java中别忘了加反斜线\进行转义。
查询成功截图: