首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SimpleJdbcInsert无法定位表“user_models”的列,因此无法生成insert语句

SimpleJdbcInsert无法定位表“user_models”的列,因此无法生成insert语句
EN

Stack Overflow用户
提问于 2015-01-19 14:32:02
回答 5查看 4.3K关注 0票数 2

我收到了这个错误

代码语言:javascript
复制
Unable to locate columns for table 'user_models' so an insert statement can't be generated

使用Spring3.1.2。我正在维护一个遗留代码。并且它(抛出异常的方法)有注释@Transactional(propagation = Propagation.REQUIRED)。另外,它正在使用缓存,并且有下面的注释@CacheEvict(value = "UserModel", key = "#userModel.id") --我在这个异常上碰到了死胡同。我只找到了一个关于这个错误的链接:https://jira.spring.io/browse/SPR-4782,我无法理解它。至少有人能指引我走向正确的方向。

编辑

堆栈跟踪如下:

代码语言:javascript
复制
Server Error occured while executing method [saveModel] org.springframework.dao.InvalidDataAccessApiUsageException: Unable to locate columns for table 'user_models' so an insert statement can't be generated
        at org.springframework.jdbc.core.metadata.TableMetaDataContext.createInsertString(TableMetaDataContext.java:325)
        at org.springframework.jdbc.core.simple.AbstractJdbcInsert.compileInternal(AbstractJdbcInsert.java:282)
        at org.springframework.jdbc.core.simple.AbstractJdbcInsert.compile(AbstractJdbcInsert.java:265)
        at org.springframework.jdbc.core.simple.AbstractJdbcInsert.checkCompiled(AbstractJdbcInsert.java:316)
        at org.springframework.jdbc.core.simple.AbstractJdbcInsert.doExecute(AbstractJdbcInsert.java:342)
        at org.springframework.jdbc.core.simple.SimpleJdbcInsert.execute(SimpleJdbcInsert.java:114)
        at com.capillary.recommender.model.user.data.dao.impl.UserModelDaoImpl.save(UserModelDaoImpl.java:344)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
        at java.lang.reflect.Method.invoke(Method.java:597)
        at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:319)
        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.invoke(TransactionInterceptor.java:110)
        at com.capillary.common.spring.transaction.ProxyTransactionInterceptor.invoke(ProxyTransactionInterceptor.java:30)
        at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
        at org.springframework.cache.interceptor.CacheInterceptor$1.invoke(CacheInterceptor.java:58)
        at org.springframework.cache.interceptor.CacheAspectSupport.execute(CacheAspectSupport.java:213)
        at org.springframework.cache.interceptor.CacheInterceptor.invoke(CacheInterceptor.java:66)
        at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
        at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:202)
        at com.sun.proxy.$Proxy67.save(Unknown Source)
        at com.capillary.recommender.model.user.UserModelStore.saveModel(UserModelStore.java:62)
        at com.capillary.recommender.model.user.UserModelStore.saveModel(UserModelStore.java:19)
        at com.capillary.recommender.thrift.ThriftRecommenderService.saveModel(ThriftRecommenderService.java:168)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)

在下面抛出错误的代码片段:

代码语言:javascript
复制
Map<String, Object> args = ImmutableMap.<String, Object>builder()
                .put(ID_COL, modelId)
                .put(ORG_ID_COL, orgId)
                .put(NAME_COL, name)
                .put(SCORES_TABLE_NAME_COL, scoresTableName)
                .put(TARGET_TABLE_NAME_COL, targetTableName)
                .put(ATTRIB_JSON_COL, attributes)
                .build();

        if (insert) {
            insert().withTableName(TABLE).execute(args);
            userModel.setId(modelId);

上面这个是DaoImpl。表的值在Dao之上的层中声明为

公共静态最终字符串表= "user_models";

EN

回答 5

Stack Overflow用户

发布于 2015-09-07 11:09:17

我也犯过同样的错误。结果发现问题是表名上的错误。再次检查您是否正确地键入了表名。

票数 2
EN

Stack Overflow用户

发布于 2016-04-05 11:30:30

我们也犯了同样的错误。

我们的'tableName‘是另一个模式中的表的同义词。

但是关于https://jira.spring.io/browse/SPR-4782,默认情况下,Oracle连接配置为"includeSynonyms“= false。

试试这个来解决这个问题:

代码语言:javascript
复制
new SimpleJdbcInsert(datasource)
.includeSynonymsForTableColumnMetaData()
.withTableName("tableName");

此外,我们还有pooledConnections,因此为了处理这个问题,我们必须指定本地jdbc提取器:

代码语言:javascript
复制
new SimpleJdbcInsert(datasource)
.useNativeJdbcExtractorForNetaData(new OracleJdbc4NativeJdbcExtractor())
.includeSynonymsForTableColumnMetaData()
.withTableName("tableName");
票数 2
EN

Stack Overflow用户

发布于 2019-01-29 03:13:30

除了表名之外,还需要指定列:

代码语言:javascript
复制
String[] columns = {"column1","column2"}

SimpleJdbcInsert jdbcInsert = new SimpleJdbcInsert(dataSource)
                .usingColumns(columns)
                .withTableName(table);
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28026966

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档