Mybatis collection查詢集合屬性報錯
錯誤日志
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
|
org.springframework.http.converter.HttpMessageConversionException: Type definition error: [simple type, class org.apache.ibatis.executor.loader.javassist.JavassistProxyFactory$EnhancedResultObjectProxyImpl]; nested exception is com.fasterxml.jackson.databind.exc.InvalidDefinitionException: No serializer found for class org.apache.ibatis.executor.loader.javassist.JavassistProxyFactory$EnhancedResultObjectProxyImpl and no properties discovered to create BeanSerializer (to avoid exception, disable SerializationFeature.FAIL_ON_EMPTY_BEANS) (through reference chain: com.hexagonsi.sandtablebackendservice.controller.viewModel.ReturnResult[ "data" ]->java.util.ArrayList[ 0 ]->com.hexagonsi.sandtablebackendservice.model.AreaBean_$$_jvstc74_0[ "handler" ]) at org.springframework.http.converter.json.AbstractJackson2HttpMessageConverter.writeInternal(AbstractJackson2HttpMessageConverter.java: 303 ) at org.springframework.http.converter.AbstractGenericHttpMessageConverter.write(AbstractGenericHttpMessageConverter.java: 104 ) at org.springframework.web.servlet.mvc.method.annotation.AbstractMessageConverterMethodProcessor.writeWithMessageConverters(AbstractMessageConverterMethodProcessor.java: 287 ) at org.springframework.web.servlet.mvc.method.annotation.HttpEntityMethodProcessor.handleReturnValue(HttpEntityMethodProcessor.java: 226 ) at org.springframework.web.method.support.HandlerMethodReturnValueHandlerComposite.handleReturnValue(HandlerMethodReturnValueHandlerComposite.java: 82 ) at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java: 124 ) at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java: 879 ) at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java: 793 ) at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java: 87 ) at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java: 1040 ) at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java: 943 ) at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java: 1006 ) at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java: 898 ) at javax.servlet.http.HttpServlet.service(HttpServlet.java: 634 ) at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java: 883 ) at javax.servlet.http.HttpServlet.service(HttpServlet.java: 741 ) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java: 231 ) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java: 166 ) at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java: 53 ) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java: 193 ) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java: 166 ) at org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java: 61 ) at org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java: 108 ) at org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java: 137 ) at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java: 125 ) at org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java: 66 ) at org.apache.shiro.web.servlet.AbstractShiroFilter.executeChain(AbstractShiroFilter.java: 449 ) at org.apache.shiro.web.servlet.AbstractShiroFilter$ 1 .call(AbstractShiroFilter.java: 365 ) at org.apache.shiro.subject.support.SubjectCallable.doCall(SubjectCallable.java: 90 ) at org.apache.shiro.subject.support.SubjectCallable.call(SubjectCallable.java: 83 ) at org.apache.shiro.subject.support.DelegatingSubject.execute(DelegatingSubject.java: 387 ) at org.apache.shiro.web.servlet.AbstractShiroFilter.doFilterInternal(AbstractShiroFilter.java: 362 ) at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java: 125 ) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java: 193 ) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java: 166 ) at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java: 100 ) at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java: 119 ) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java: 193 ) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java: 166 ) at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java: 93 ) at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java: 119 ) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java: 193 ) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java: 166 ) at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java: 201 ) at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java: 119 ) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java: 193 ) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java: 166 ) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java: 202 ) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java: 96 ) at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java: 541 ) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java: 139 ) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java: 92 ) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java: 74 ) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java: 343 ) at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java: 367 ) at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java: 65 ) at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java: 868 ) at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java: 1639 ) at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java: 49 ) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java: 1142 ) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java: 617 ) at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java: 61 ) at java.lang.Thread.run(Thread.java: 745 ) |
背景
使用collection查詢集合屬性數據
排查
如下圖,發現在查詢數據后,實體類中自動添加了一個“handler”屬性,該屬性是沒有對應的set/get方法
解決方法
在結合屬性所在的類上添加注解:轉json時,忽略自動產生的handler屬性
1
|
@JsonIgnoreProperties (value = { "handler" }) |
用以在json序列化時忽略bean中一些不需要轉化的屬性
MyBatis 包含屬性為集合的查詢
父實體類
1
2
3
4
5
|
public class MerchantsVO { private Integer id; private String name; private List<PaymentAccountVO> paymentAccountList; } |
關聯子查詢實體類
1
2
3
4
|
public class PaymentAccountVO { private Integer id; private Integer merchantsId; } |
父查詢返回結果實體類映射
1
2
3
4
5
6
7
8
|
< resultMap id = "merchantsResultMap" type = "com.entity.vo.MerchantsVO" > < result property = "id" column = "id" /> < result property = "name" column = "name" /> < collection property = "paymentAccountList" ofType = "com.entity.vo.PaymentAccountVO" column = "id" select = "getPaymentAccountByMerchantsId" fetchType = "eager" > </ collection > </ resultMap > < collection >標簽中的 column="id" , 對應為父實體類數據庫映射字段,用于關聯子查詢 |
集合子查詢實體類映射
1
2
3
4
5
|
< resultMap id = "paymentAccountResultMap" type = "com.entity.vo.PaymentAccountVO" > <!-- 定義這個集合中元素的封裝規則 --> < result property = "id" column = "id" /> < result property = "merchantsId" column = "merchants_id" /> </ resultMap > |
父查詢
1
2
3
|
< select id = "getMerchantsVOList" resultMap = "merchantsResultMap" > SELECT m.* FROM merchants m </ select > |
子查詢
1
2
3
|
< select id = "getPaymentAccountByMerchantsId" resultMap = "paymentAccountResultMap" > SELECT * FROM payment_account WHERE merchants_id = #{id} </ select > |
以上為個人經驗,希望能給大家一個參考,也希望大家多多支持服務器之家。
原文鏈接:https://blog.csdn.net/xiulongshan/article/details/109238605