crm开发定制解决 java.sql.SQLSyntaxErrorException:Unknown column ‘xxx‘ in ‘field list‘的问题

文章目录

1. 复现问题

crm开发定制今天在调用/auth/login方法,crm开发定制报出了如下错误:

2022-08-21 12:50:43.781 [ http-nio-8081-exec-1 ] - [ ERROR ] [ druid.sql.Statement : 148 ] - {conn-10005, pstmt-20007} execute error. select permission0_.role_id as role_id1_2_0_, permission0_.permission_id as permissi2_2_0_, permission1_.id as id1_0_1_, permission1_.permission_value as permissi2_0_1_ from se_role_permission permission0_ inner join se_permission permission1_ on permission0_.permission_id=permission1_.id where permission0_.role_id=?java.sql.SQLSyntaxErrorException: Unknown column 'permission1_.permission_value' in 'field list'	at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:120)	at com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:122)	at com.mysql.cj.jdbc.ClientPreparedStatement.executeInternal(ClientPreparedStatement.java:953)	at com.mysql.cj.jdbc.ClientPreparedStatement.executeQuery(ClientPreparedStatement.java:1003)	at com.alibaba.druid.filter.FilterChainImpl.preparedStatement_executeQuery(FilterChainImpl.java:3225)	at com.alibaba.druid.filter.FilterEventAdapter.preparedStatement_executeQuery(FilterEventAdapter.java:459)	at com.alibaba.druid.filter.FilterChainImpl.preparedStatement_executeQuery(FilterChainImpl.java:3222)	at com.alibaba.druid.wall.WallFilter.preparedStatement_executeQuery(WallFilter.java:659)	at com.alibaba.druid.filter.FilterChainImpl.preparedStatement_executeQuery(FilterChainImpl.java:3222)	at com.alibaba.druid.filter.FilterEventAdapter.preparedStatement_executeQuery(FilterEventAdapter.java:459)	at com.alibaba.druid.filter.FilterChainImpl.preparedStatement_executeQuery(FilterChainImpl.java:3222)	at com.alibaba.druid.proxy.jdbc.PreparedStatementProxyImpl.executeQuery(PreparedStatementProxyImpl.java:166)	at com.alibaba.druid.pool.DruidPooledPreparedStatement.executeQuery(DruidPooledPreparedStatement.java:213)	at org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.extract(ResultSetReturnImpl.java:57)	at org.hibernate.loader.plan.exec.internal.AbstractLoadPlanBasedLoader.getResultSet(AbstractLoadPlanBasedLoader.java:390)	at org.hibernate.loader.plan.exec.internal.AbstractLoadPlanBasedLoader.executeQueryStatement(AbstractLoadPlanBasedLoader.java:163)	at org.hibernate.loader.plan.exec.internal.AbstractLoadPlanBasedLoader.executeLoad(AbstractLoadPlanBasedLoader.java:104)	at org.hibernate.loader.collection.plan.AbstractLoadPlanBasedCollectionInitializer.initialize(AbstractLoadPlanBasedCollectionInitializer.java:87)	at org.hibernate.persister.collection.AbstractCollectionPersister.initialize(AbstractCollectionPersister.java:710)	at org.hibernate.event.internal.DefaultInitializeCollectionEventListener.onInitializeCollection(DefaultInitializeCollectionEventListener.java:76)	at org.hibernate.event.service.internal.EventListenerGroupImpl.fireEventOnEachListener(EventListenerGroupImpl.java:93)	at org.hibernate.internal.SessionImpl.initializeCollection(SessionImpl.java:2163)	at org.hibernate.collection.internal.AbstractPersistentCollection$4.doWork(AbstractPersistentCollection.java:589)	at org.hibernate.collection.internal.AbstractPersistentCollection.withTemporarySessionIfNeeded(AbstractPersistentCollection.java:264)	at org.hibernate.collection.internal.AbstractPersistentCollection.initialize(AbstractPersistentCollection.java:585)	at org.hibernate.collection.internal.AbstractPersistentCollection.read(AbstractPersistentCollection.java:149)	at org.hibernate.collection.internal.PersistentSet.hashCode(PersistentSet.java:458)	at com.superjson.superjsonmanager.entity.Role.hashCode(Role.java:15)	at java.util.HashMap.hash(HashMap.java:338)	at java.util.HashMap.put(HashMap.java:611)	at java.util.HashSet.add(HashSet.java:219)	at java.util.AbstractCollection.addAll(AbstractCollection.java:344)	at org.hibernate.collection.internal.PersistentSet.endRead(PersistentSet.java:355)	at org.hibernate.engine.loading.internal.CollectionLoadContext.endLoadingCollection(CollectionLoadContext.java:239)	at org.hibernate.engine.loading.internal.CollectionLoadContext.endLoadingCollections(CollectionLoadContext.java:224)	at org.hibernate.engine.loading.internal.CollectionLoadContext.endLoadingCollections(CollectionLoadContext.java:198)	at org.hibernate.loader.plan.exec.process.internal.CollectionReferenceInitializerImpl.endLoading(CollectionReferenceInitializerImpl.java:154)	at org.hibernate.loader.plan.exec.process.internal.AbstractRowReader.finishLoadingCollections(AbstractRowReader.java:259)	at org.hibernate.loader.plan.exec.process.internal.AbstractRowReader.finishUp(AbstractRowReader.java:211)	at org.hibernate.loader.plan.exec.process.internal.ResultSetProcessorImpl.extractResults(ResultSetProcessorImpl.java:96)	at org.hibernate.loader.plan.exec.internal.AbstractLoadPlanBasedLoader.executeLoad(AbstractLoadPlanBasedLoader.java:105)	at org.hibernate.loader.collection.plan.AbstractLoadPlanBasedCollectionInitializer.initialize(AbstractLoadPlanBasedCollectionInitializer.java:87)	at org.hibernate.persister.collection.AbstractCollectionPersister.initialize(AbstractCollectionPersister.java:710)	at org.hibernate.event.internal.DefaultInitializeCollectionEventListener.onInitializeCollection(DefaultInitializeCollectionEventListener.java:76)	at org.hibernate.event.service.internal.EventListenerGroupImpl.fireEventOnEachListener(EventListenerGroupImpl.java:93)	at org.hibernate.internal.SessionImpl.initializeCollection(SessionImpl.java:2163)	at org.hibernate.collection.internal.AbstractPersistentCollection$4.doWork(AbstractPersistentCollection.java:589)	at org.hibernate.collection.internal.AbstractPersistentCollection.withTemporarySessionIfNeeded(AbstractPersistentCollection.java:264)	at org.hibernate.collection.internal.AbstractPersistentCollection.initialize(AbstractPersistentCollection.java:585)	at org.hibernate.collection.internal.AbstractPersistentCollection.forceInitialization(AbstractPersistentCollection.java:781)	at org.hibernate.engine.internal.StatefulPersistenceContext.initializeNonLazyCollections(StatefulPersistenceContext.java:1001)	at org.hibernate.engine.internal.StatefulPersistenceContext.initializeNonLazyCollections(StatefulPersistenceContext.java:987)	at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:354)	at org.hibernate.loader.Loader.doList(Loader.java:2849)	at org.hibernate.loader.Loader.doList(Loader.java:2831)	at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2663)	at org.hibernate.loader.Loader.list(Loader.java:2658)	at org.hibernate.loader.hql.QueryLoader.list(QueryLoader.java:506)	at org.hibernate.hql.internal.ast.QueryTranslatorImpl.list(QueryTranslatorImpl.java:400)	at org.hibernate.engine.query.spi.HQLQueryPlan.performList(HQLQueryPlan.java:219)	at org.hibernate.internal.SessionImpl.list(SessionImpl.java:1414)	at org.hibernate.query.internal.AbstractProducedQuery.doList(AbstractProducedQuery.java:1636)	at org.hibernate.query.internal.AbstractProducedQuery.list(AbstractProducedQuery.java:1604)	at org.hibernate.query.internal.AbstractProducedQuery.getSingleResult(AbstractProducedQuery.java:1652)	at org.hibernate.query.criteria.internal.compile.CriteriaQueryTypeQueryAdapter.getSingleResult(CriteriaQueryTypeQueryAdapter.java:111)	at org.springframework.data.jpa.repository.query.JpaQueryExecution$SingleEntityExecution.doExecute(JpaQueryExecution.java:196)	at org.springframework.data.jpa.repository.query.JpaQueryExecution.execute(JpaQueryExecution.java:88)	at org.springframework.data.jpa.repository.query.AbstractJpaQuery.doExecute(AbstractJpaQuery.java:155)	at org.springframework.data.jpa.repository.query.AbstractJpaQuery.execute(AbstractJpaQuery.java:143)	at org.springframework.data.repository.core.support.RepositoryMethodInvoker.doInvoke(RepositoryMethodInvoker.java:137)	at org.springframework.data.repository.core.support.RepositoryMethodInvoker.invoke(RepositoryMethodInvoker.java:121)	at org.springframework.data.repository.core.support.QueryExecutorMethodInterceptor.doInvoke(QueryExecutorMethodInterceptor.java:159)	at org.springframework.data.repository.core.support.QueryExecutorMethodInterceptor.invoke(QueryExecutorMethodInterceptor.java:138)	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)	at org.springframework.data.projection.DefaultMethodInvokingMethodInterceptor.invoke(DefaultMethodInvokingMethodInterceptor.java:80)	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)	at org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:123)	at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:388)	at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:119)	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)	at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:137)	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)	at org.springframework.data.jpa.repository.support.CrudMethodMetadataPostProcessor$CrudMethodMetadataPopulatingMethodInterceptor.invoke(CrudMethodMetadataPostProcessor.java:145)	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)	at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:97)	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)	at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:215)	at com.sun.proxy.$Proxy122.getUserByUsername(Unknown Source)	at com.superjson.superjsonmanager.service.impl.UserServiceImpl.getUserByUsername(UserServiceImpl.java:53)	at com.superjson.superjsonmanager.config.shiro.DbShiroRealm.doGetAuthenticationInfo(DbShiroRealm.java:40)	at org.apache.shiro.realm.AuthenticatingRealm.getAuthenticationInfo(AuthenticatingRealm.java:571)	at org.apache.shiro.authc.pam.ModularRealmAuthenticator.doMultiRealmAuthentication(ModularRealmAuthenticator.java:225)	at org.apache.shiro.authc.pam.ModularRealmAuthenticator.doAuthenticate(ModularRealmAuthenticator.java:275)	at org.apache.shiro.authc.AbstractAuthenticator.authenticate(AbstractAuthenticator.java:198)	at org.apache.shiro.mgt.AuthenticatingSecurityManager.authenticate(AuthenticatingSecurityManager.java:106)	at org.apache.shiro.mgt.DefaultSecurityManager.login(DefaultSecurityManager.java:275)	at org.apache.shiro.subject.support.DelegatingSubject.login(DelegatingSubject.java:260)	at com.superjson.superjsonmanager.config.shiro.controller.AuthController.login(AuthController.java:37)	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)	at java.lang.reflect.Method.invoke(Method.java:498)	at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:197)	at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:141)	at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:106)	at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:894)	at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:808)	at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87)	at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1063)	at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:963)	at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006)	at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:909)	at javax.servlet.http.HttpServlet.service(HttpServlet.java:652)	at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883)	at javax.servlet.http.HttpServlet.service(HttpServlet.java:733)	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:227)	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)	at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)	at com.alibaba.druid.support.http.WebStatFilter.doFilter(WebStatFilter.java:114)	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)	at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:112)	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)	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.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:450)	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:189)	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)	at org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:204)	at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:183)	at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:358)	at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:271)	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)	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:189)	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)	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:189)	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)	at org.springframework.boot.actuate.metrics.web.servlet.WebMvcMetricsFilter.doFilterInternal(WebMvcMetricsFilter.java:96)	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)	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:189)	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:202)	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:97)	at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:542)	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:143)	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92)	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:78)	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:357)	at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:374)	at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65)	at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:893)	at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1707)	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)
  • 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
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • 109
  • 110
  • 111
  • 112
  • 113
  • 114
  • 115
  • 116
  • 117
  • 118
  • 119
  • 120
  • 121
  • 122
  • 123
  • 124
  • 125
  • 126
  • 127
  • 128
  • 129
  • 130
  • 131
  • 132
  • 133
  • 134
  • 135
  • 136
  • 137
  • 138
  • 139
  • 140
  • 141
  • 142
  • 143
  • 144
  • 145
  • 146
  • 147
  • 148
  • 149
  • 150
  • 151
  • 152
  • 153
  • 154
  • 155
  • 156
  • 157
  • 158
  • 159
  • 160
  • 161
  • 162
  • 163
  • 164
  • 165
  • 166
  • 167
  • 168
  • 169
  • 170
  • 171
  • 172
  • 173
  • 174
  • 175
  • 176
  • 177
  • 178
  • 179
  • 180
  • 181
  • 182
  • 183
  • 184

crm开发定制这么长串的错误信息,crm开发定制我们只要关注java.sql.SQLSyntaxErrorException: Unknown column 'permission1_.permission_value' in 'field list'

2. 分析问题

根据上述错误信息的SQL可以看出permission1_se_permission,换句话说在se_permission表中没有找到permission_value属性,为什么没有找到这个属性呢?进行如下分析。

  1. 执行错误信息中的mysql语句,如下所示:
mysql> SELECT    permission0_.role_id AS role_id1_2_0_,    permission0_.permission_id AS permissi2_2_0_,    permission1_.id AS id1_0_1_,    permission1_.permission_value AS permissi2_0_1_  FROM    se_role_permission permission0_  INNER JOIN se_permission permission1_ ON permission0_.permission_id = permission1_.id  WHERE    permission0_.role_id =1;    ERROR 1054 (42S22): Unknown column 'permission1_.permission_value' in 'field list'
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  1. 查询表se_permission字段信息,如下所示:
mysql> select DISTINCT COLUMN_NAME 字段名, COLUMN_TYPE 字段类型,COLUMN_key 是否主键 from  information_schema.COLUMNS where table_name = 'se_permission';+-----------------+--------------+--------------+| 字段名          | 字段类型     | 是否主键     |+-----------------+--------------+--------------+| id              | int(11)      | PRI          || permissionValue | varchar(255) |              |+-----------------+--------------+--------------+2 rows in set (0.00 sec)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

se_permission中的字段是permissionValue,而不是permission_value。但是,我的Permission类的permissionValue属性已经指明了字段为permissionValue,如下代码所示:

package com.superjson.superjsonmanager.entity;import lombok.Data;import javax.persistence.*;import java.io.Serializable;/** * @author baoya * @create 2020-05-29 10:04 */@Entity@Data@Table(name="se_permission")public class Permission implements Serializable {    @Id    @GeneratedValue(strategy = GenerationType.IDENTITY)    private int id;        @Column(name = "permissionValue")    private String permissionValue;}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22

也就是说,即便我们使用@Column(name = "permissionValue")指明了数据库字段,但orm框架在将Javabean属性转为SQL字段时,采用的是将驼峰的属性转为下划线字段的方式。

所以,springframework.data.jpa找不到permission_value字段。

3. 解决问题

既然知道上述错误问题的原因所在,我们无法修改orm框架,只能修改数据库的字段,如下代码所示:

mysql> ALTER TABLE `se_permission` CHANGE COLUMN `permissionValue` `permission_value` VARCHAR (255) NOT NULL;Query OK, 0 rows affected (0.01 sec)Records: 0  Duplicates: 0  Warnings: 0
  • 1
  • 2
  • 3

数据库修改完成后,我们重新启动 spring boot,调用/auth/login方法,便能成功登录,如下图所示:

4. 重要总结-阿里巴巴建表规约

这种错误一般就是orm框架转化的数据表字段和MySQL表中的数据表字段不一致造成。由此,我想到了阿里巴巴java开发规约中的MySQL的建表规规约的第2条,如下所示:

【强制】表名、字段名必须使用小写字母或数字;禁止出现数字开头,禁止两个下划线中间只出现数字。数据库字段名的修改代价很大,因为无法进行预发布,所以字段名称需要慎重考虑。

正例:getter_admin,task_config,level3_name
反例:GetterAdmin,taskConfig,level_3_name

这点很重要。我们创建数据表的字段时,应该采用下划线的方式。因为,java中有些orm框架会将Javabean属性转化为下划线形式的数据表字段,这就会导致上述数据表字段不存在的问题。

网站建设定制开发 软件系统开发定制 定制软件开发 软件开发定制 定制app开发 app开发定制 app开发定制公司 电商商城定制开发 定制小程序开发 定制开发小程序 客户管理系统开发定制 定制网站 定制开发 crm开发定制 开发公司 小程序开发定制 定制软件 收款定制开发 企业网站定制开发 定制化开发 android系统定制开发 定制小程序开发费用 定制设计 专注app软件定制开发 软件开发定制定制 知名网站建设定制 软件定制开发供应商 应用系统定制开发 软件系统定制开发 企业管理系统定制开发 系统定制开发