在mybatis字段对应不上出现的小错误

本文解决了一个MyBatis中因实体类属性与映射文件字段不匹配导致的异常问题,具体表现为无法找到对应的setter方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.reflection.ReflectionException: Could not set property 'printStyle' of 'class cn.itcast.jk.domain.Contract' with value '2' Cause: org.apache.ibatis.reflection.ReflectionException: There is no setter for property named 'printStyle' in 'class cn.itcast.jk.domain.Contract'at org.mybatis.spring.MyBatisExceptionTranslator.translateExceptionIfPossible(MyBatisExceptionTranslator.java:73)at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:364)at com.sun.proxy.$Proxy6.selectList(Unknown Source)at org.mybatis.spring.SqlSessionTemplate.selectList(SqlSessionTemplate.java:194)at cn.itcast.jk.dao.impl.BaseDaoImpl.find(BaseDaoImpl.java:35)at cn.itcast.jk.service.impl.ContractServiceImpl.find(ContractServiceImpl.java:31)at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)at java.lang.reflect.Method.invoke(Method.java:601)at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:317)at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:183)at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:150)at org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:96)at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:260)at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:94)at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:91)at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:204)at com.sun.proxy.$Proxy9.find(Unknown Source)at cn.itcast.jk.controller.cargo.contract.ContractController.list(ContractController.java:28)at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)at java.lang.reflect.Method.invoke(Method.java:601)at org.springframework.web.bind.annotation.support.HandlerMethodInvoker.invokeHandlerMethod(HandlerMethodInvoker.java:176)at org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.invokeHandlerMethod(AnnotationMethodHandlerAdapter.java:440)at org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.handle(AnnotationMethodHandlerAdapter.java:428)at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:925)at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:856)at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:936)at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:827)at javax.servlet.http.HttpServlet.service(HttpServlet.java:617)at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:812)at javax.servlet.http.HttpServlet.service(HttpServlet.java:723)at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:88)at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103)at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293)at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:861)at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:606)at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489)at java.lang.Thread.run(Thread.java:722)Caused by: org.apache.ibatis.reflection.ReflectionException: Could not set property 'printStyle' of 'class cn.itcast.jk.domain.Contract' with value '2' Cause: org.apache.ibatis.reflection.ReflectionException: There is no setter for property named 'printStyle' in 'class cn.itcast.jk.domain.Contract'at org.apache.ibatis.reflection.wrapper.BeanWrapper.setBeanProperty(BeanWrapper.java:172)at org.apache.ibatis.reflection.wrapper.BeanWrapper.set(BeanWrapper.java:54)at org.apache.ibatis.reflection.MetaObject.setValue(MetaObject.java:130)at org.apache.ibatis.executor.resultset.FastResultSetHandler.applyPropertyMappings(FastResultSetHandler.java:304)at org.apache.ibatis.executor.resultset.FastResultSetHandler.getRowValue(FastResultSetHandler.java:270)at org.apache.ibatis.executor.resultset.FastResultSetHandler.handleRowValues(FastResultSetHandler.java:216)at org.apache.ibatis.executor.resultset.FastResultSetHandler.handleResultSet(FastResultSetHandler.java:188)at org.apache.ibatis.executor.resultset.FastResultSetHandler.handleResultSets(FastResultSetHandler.java:154)at org.apache.ibatis.executor.statement.PreparedStatementHandler.query(PreparedStatementHandler.java:57)at org.apache.ibatis.executor.statement.RoutingStatementHandler.query(RoutingStatementHandler.java:70)at org.apache.ibatis.executor.SimpleExecutor.doQuery(SimpleExecutor.java:57)at org.apache.ibatis.executor.BaseExecutor.queryFromDatabase(BaseExecutor.java:259)at org.apache.ibatis.executor.BaseExecutor.query(BaseExecutor.java:132)at org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:105)at org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:81)at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:104)at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:98)at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)at java.lang.reflect.Method.invoke(Method.java:601)at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:354)... 50 moreCaused by: org.apache.ibatis.reflection.ReflectionException: There is no setter for property named 'printStyle' in 'class cn.itcast.jk.domain.Contract'at org.apache.ibatis.reflection.Reflector.getSetInvoker(Reflector.java:369)at org.apache.ibatis.reflection.MetaClass.getSetInvoker(MetaClass.java:171)at org.apache.ibatis.reflection.wrapper.BeanWrapper.setBeanProperty(BeanWrapper.java:164)... 71 more


<mapper namespace="cn.itcast.jk.mapper.ContractMapper">
	<resultMap type="cn.itcast.jk.domain.Contract" id="contractRM">
		<id property="id" column="CONTRACT_ID"/>
		<result property="offeror" column="OFFEROR"/>
		<result property="contractNo" column="CONTRACT_NO"/>
		<result property="signingDate" column="SIGNING_DATE"/>
		<result property="inputBy" column="INPUT_BY"/>
		<result property="checkBy" column="CHECK_BY"/>
		<result property="inspector" column="INSPECTOR"/>
		<result property="totalAmount" column="TOTAL_AMOUNT"/>
		<result property="importNum" column="IMPORT_NUM"/>
		<result property="crequest" column="CREQUEST"/>
		<result property="customName" column="CUSTOM_NAME"/>
		<result property="deliveryPeriod" column="DELIVERY_PERIOD"/>
		<result property="shipTime" column="SHIP_TIME"/>
		<result property="tradeTerms" column="TRADE_TERMS"/>
		<result property="remark" column="REMARK"/>
		<result property="printStyle" column="PRINT_STYLE"/>
		<result property="oldState" column="OLD_STATE"/>
		<result property="state" column="STATE"/>
		<result property="outState" column="OUT_STATE"/>
		
		<result property="createBy" column="CREATE_BY"/>
		<result property="createDept" column="CREATE_DEPT"/>
		<result property="createTime" column="CREATE_TIME"/>
	</resultMap>
	

错误的原因是因为在mybatis的映射的时候找不到相应的 set方法,也就是在实体类中的属性和映射写sql的文件的字段必须相对应,并且有set和get方法,以上错误为字段书写不对应
### MyBatis Collection 字段映射错误解决方案 在处理 MyBatis 中 `collection` 字段映射时遇到的问题通常源于配置当或 SQL 查询中的列名匹配。以下是针对这些问题的具体分析和解决方案。 #### 1. 简化集合映射配置 对于大多数情况,MyBatis 能够自动推断 Java 类型属性,因此需要显式指定 `javaType` 属性。这意味着可以简化 `<collection>` 标签的定义: ```xml <collection property="posts" column="id" ofType="Post" select="selectPostsForBlog"/> ``` 这种简化的形式适用于常规场景下的集合映射[^1]。 #### 2. 处理复杂数据类型的映射 如果涉及到更复杂的 JDBC 数据类型(如结构体),则需要提供额外的信息来帮助 MyBatis 正确解析返回的结果集。例如,在注册 OUT 参数时应指明具体的语句类型名称: ```xml <span style="color:#880000"> #{middleInitial, mode=OUT, jdbcType=STRUCT, jdbcTypeName=MY_TYPE, resultMap=departmentResultMap} </span> ``` 此设置确保了 MyBatis 可以识别并正确处理这些特殊的数据类型[^2]。 #### 3. 解决因列存在而导致的异常 当查询条件中使用的列名与数据库表的实际列名符时,可能会抛类似于 `"column '未认领' does not exist"` 的错误消息。为了避免这种情况发生,建议采用参数化的方式构建 WHERE 子句而是硬编码字符串值: ```xml <select id="selectByStatus" resultMap="BaseResultMap"> SELECT <include refid="Base_Column_List"/> FROM en_periodical_thesis e WHERE e.claim_status = #{status} </select> ``` 通过这种方式传递变量 `${status}` 或者使用预编译占位符 `#{status}`, 仅提高了安全性还增强了灵活性[^3]. #### 示例代码展示如何修正常见的 collection 映射问题: 假设有一个博客实体类 Blog 和其关联的文章列表 Posts,则可以在对应的 Mapper 文件里做如下调整: ```xml <!-- 定义基础结果映射 --> <resultMap id="blogResultMap" type="Blog"> <!-- ...其他字段... --> <!-- 使用 collection 进行一对多关系映射 --> <collection property="posts" javaType="ArrayList" ofType="Post" column="{blogId=id}" select="findPostsByBlogId"/> </resultMap> <!-- 对应的选择语句用于获取文章详情 --> <select id="findPostsByBlogId" resultType="Post"> SELECT * FROM posts p WHERE p.blog_id = #{blogId}; </select> ``` 上述例子展示了如何利用 `collection` 实现一对一或多对一的关系映射,并且注意到了可能引起问题的地方进行了优化改进。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值