解决 Mybatis 报错 org.apache.ibatis.ognl.NoSuchPropertyException: XXXCriteria$Criterion.noValue
最新推荐文章于 2024-06-19 09:29:01 发布
qq_34412985
最新推荐文章于 2024-06-19 09:29:01 发布
阅读量2.1k
这个 noValue 一定存在,但是报错。 场景就是存在并发的情况下,尤其是在服务刚刚启动的时候,就会发生这个异常。
但是很不幸,mybatis 3.4.1 之前,用的 OGNL 都是由这个问题。
3.4.1 之前的版本的 OgnlRuntime,这里,第三个参数传 0,则永远都是 null。
public static final Object getMethodValue(OgnlContext context, Object target, String propertyName, boolean checkAccessAndExistence) throws OgnlException, IllegalAccessException, NoSuchMethodException, IntrospectionException {
Object result = null;
Method m = getGetMethod(context, target == null ? null : target.getClass(), propertyName);
if (m == null) {
m = getReadMethod(target == null ? null : target.getClass(), propertyName, 0);
3.4.1 以及以后的版本:
public static final Object getMethodValue(OgnlContext context, Object target, String propertyName, boolean checkAccessAndExistence) throws OgnlException, IllegalAccessException, NoSuchMethodException, IntrospectionException {
Object result = null;
Method m = getGetMethod(context, target == null ? null : target.getClass(), propertyName);
if (m == null) {
m = getReadMethod(target == null ? null : target.getClass(), propertyName, (Class[])null);
显然 getReadMethod 这个地方的实现已经完全发生改变。
而 getGetMethod 存在 并发问题,线程不安全。
mybatis - Caused by: org.apache.ibatis.ognl.NoSuchPropertyException: - Stack Overflow
org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): com.mindskip.xzs.repository.SubjectMapper.page
at com.baomidou.mybatisplus.core.override.PageMapperMethod$SqlCommand.<init>(PageMapperMethod.java:261) ~[mybatis-plus-co
问题描述:
org.apache.ibatis.ognl.NoSuchPropertyException: com.entity.UserEntity.createDate
问题分析:
1、UserEntity类没有createDate属性,导致报错。
解决办法:UserEntity类添加createDate属性。
第一种是入参里面名字对应不上
不管你是map还是对象名字对应不上都不行
比如你在mapper里面materialName像根据来查找,但实际你入参的对象或者map里面的对象没有这个属性就会报错,报没有这样的属性异常“NoSUchProPertyException”
第二种是属性命名不规范,比如is_XXX,这种mybatis解析时就会报错,尽量避免这种命名。
...
完美解决org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.reflection.Refl
因为数据库表中有个字段名叫desc,如图所示:
desc是MySQL语法中的关键字,mybatis plus自动生成的sql中因为这个关键字的影响,就造成了语法错误。方案1:更换字段名为非MySQL关键字即可。
例如此处我把字段名改成describer,同时更改Java中的实体类属性名。
clean之后再次运行,项目顺利启动不再报错。
方案2:不使用mybatis plus ,更换成
关于mybatis报错:找不到某个属性的问题1、前言2、问题出现的场景3、解决办法
本人是在做公司一个“古董项目”的时候遇到的问题,其中造成该错误的大部分原因也是因为自己的操作失误,最后步步调试终于找出了问题的原因。做个记录有个印象,也给以后自己解决问题的思路提供一些借鉴。
2、问题出现的场景
很简单的操作,添加一条数据进行异步显示;前后端逻辑没有任何问题,因为这部分代码完成可以自动生成,也进行测试过。
但是后来我因为需求在数据库中加了一个字段——序号(order),后来用工具自动生成了代码,
在使用myabtis进行查询时报:Caused by: org.apache.ibatis.ognl.NoSuchPropertyException: com.souche.workorders.model.query.AiLogQuery.filterStart。错误。
自己检查了下实体类的属性名称和sql中的参数名称,发现没错(这里得背锅,太粗心大意了)。 百度了一番,没有找到比较靠谱的答案,只能自己上手看源码了,一层一层断点下去,最终发现
还是参数名称没写对。sql中的
解决: 如果是只有一个集合作为参数,无影响。如果除了集合参数,还有其他类型的,则批量的集合参数必须放在第一个。例如:
void updateFromManage(@BatchParameter("companyBillingItem") List companyItems,
@Param("ns