Spring boot JPA criteria builder equal方法未按预期工作

Spring boot JPA criteria builder equal方法未按预期工作,spring-boot,jpa,spring-data-jpa,Spring Boot,Jpa,Spring Data Jpa,在我的例子中,我试图通过从数据库中的json列中提取一个值来获取一些数据。我的代码如下: criteriaBuilder.equal(criteriaBuilder.function("JSON_EXTRACT", Boolean.class, root.get("result"), criteriaBuilder.literal("$.matched")), false); 上面的代码给了我一组空数据。这在查询控制台中也可以正常工作

在我的例子中,我试图通过从数据库中的json列中提取一个值来获取一些数据。我的代码如下:

criteriaBuilder.equal(criteriaBuilder.function("JSON_EXTRACT", Boolean.class, root.get("result"), criteriaBuilder.literal("$.matched")), false);
上面的代码给了我一组空数据。这在查询控制台中也可以正常工作

但是,

介于
之间的方法工作正常。这里可能有什么错误

更新

布尔值是我无法读取的值。不是整数。我的JSON结构,

{
    "status": "SUCCESS",
    "request_id": "request_id",
    "time_taken": 8454,
    "matched": false,
    "streaming_threshold": 0.5
}

我无法使它与原始布尔字段一起工作。我使用
@JsonSerialize
@JsonSerialize
将对象上的
Boolean
属性转换为
String
,反之亦然,然后将其作为json保存,并采用与您相同的方法,但现在将
String.class
搜索为
false
,而不是
Boolean
。我的解决方案如下:

实体

@实体
@表(name=“json\u容器”)
公共类JsonContainer{
@身份证
@生成值
@类型(Type=“uuid char”)
私有UUID;
@列(columnDefinition=“json”,name=“json\u data”)
私有字符串jsonData;
公共UUID getId(){
返回id;
}
公共字符串getJsonData(){
返回jsonData;
}
公共void setJsonData(字符串jsonData){
this.jsonData=jsonData;
}
公共静态类示例详细信息{
私有字符串状态;
私有字符串请求ID;
私有整数时间;
@JsonSerialize(使用=StringBooleanJsonSerializer.class)
@JsonDeserialize(使用=StringBooleanJsonDeserializer.class)
私有布尔匹配;
私人双流化阈值;
公共样本详情(){
}
公共样本详细信息(字符串状态、字符串请求ID、整数时间、布尔匹配、双流化阈值){
这个状态=状态;
this.requestId=requestId;
this.timetake=耗时;
这是匹配的;
this.streamingThreshold=streamingThreshold;
}
公共字符串getStatus(){
返回状态;
}
公共字符串getRequestId(){
返回请求ID;
}
公共整数getTimeTaken(){
返回时间;
}
公共双getStreamingThreshold(){
返回流阈值;
}
公共布尔getMatched(){
返回匹配;
}
静态类StringBooleanJsonSerializer扩展了JsonSerializer{
@凌驾
public void serialize(布尔值、JsonGenerator gen、SerializerProvider序列化程序)引发IOException{
gen.writeString(value!=null&&value?value.toString():“false”);
}
}
静态类StringBooleanJsonDeserializer扩展了JsonDeserializer{
@凌驾
公共布尔反序列化(JsonParser p,DeserializationContext ctxt)抛出IOException,JsonProcessingException{
试一试{
返回Boolean.parseBoolean(p.getText());
}捕获(运行时异常e){
返回Boolean.FALSE;
}
}
}
}
测试班

类MySQLJsonConverterTest{
@自动连线
私人实体管理者实体管理者;
@回滚(false)
@试验
void testCustomJsonConverter()引发JsonProcessingException{
JsonContainer JsonContainer=新的JsonContainer();
jsonContainer.setJsonData(
getAsJson(新的JsonContainer.SampleDetails(“success”,“12344567”,8454,false,0.1));
entityManager.persist(jsonContainer);
assertNotNull(jsonContainer.getId());
jsonContainer=新的jsonContainer();
jsonContainer.setJsonData(
getAsJson(新的JsonContainer.SampleDetails(“success”,“8989”,121,true,0.5));
entityManager.persist(jsonContainer);
assertNotNull(jsonContainer.getId());
CriteriaBuilder CriteriaBuilder=entityManager.getCriteriaBuilder();
CriteriaQuery-CriteriaQuery=criteriaBuilder.createQuery(JsonContainer.class);
Root-from=criteriaQuery.from(JsonContainer.class);
其中(criteriaBuilder.equal(criteriaBuilder.function(“JSON_EXTRACT”),String.class,from.get(“jsonData”),
criteriaBuilder.literal(“$.matched”),“false”);
TypedQuery TypedQuery=entityManager.createQuery(criteriaQuery);
List resultList=typedQuery.getResultList();
assertEquals(1,resultList.size());
}
私有字符串getAsJson(JsonContainer.SampleDetails SampleDetails)引发JsonProcessingException{
//var的创建使得调试更加简单
String json=new ObjectMapper().writeValueAsString(sampleDetails);
返回json;
}
}

您可以查看生成的SQL以查看差异。您可以发布数据库列中的json结构并告诉我们您是什么数据库吗using@silentsudo更新了问题。谢谢。我正在使用MySQL版本8.0.21,用于x86_64上的osx10.15(js.json_data,'$.matched')=true
原始mysql正在工作,但对于布尔值,它不是yes@silentsudo。
{
    "status": "SUCCESS",
    "request_id": "request_id",
    "time_taken": 8454,
    "matched": false,
    "streaming_threshold": 0.5
}