【问题标题】:Retrieving customized auto-generated keys with Spring JDBC Template使用 Spring JDBC 模板检索自定义的自动生成的密钥
【发布时间】:2014-03-23 07:21:43
【问题描述】:

插入记录后,我需要使用 spring jdbc 模板检索自定义的自动生成的密钥。

insert into CREDIT(CREDITID,PROFILEID,CLIENTID,EVENTID,CREDIT_HEADING,CREDIT_DESCRIPTION,CREDIT_IMAGE,TESTIMONIAL,TESTIMONIAL_PROVIDER) values('CRE'||CREDITID_SEQ.nextVal,:profileId,:clientId,:eventId,:creditHeading,:creditDescription,:creditImage,:testimonial,:provider)

如果您看到我使用了一个以“CRE”为前缀的 sequence.nextVal 作为主键值。目的是拥有像 CRE1, CRE2,CRE3....CREn 这样的键。我希望使用 spring jdbc 模板检索它。这是我编写的代码,但它引发了异常。

  public String insertCredit(final Credit credit) throws SQLException {


                final String insertQuery = dbUtil.getQuery("crms.credit.insert");
                SqlParameterSource creditParameters = new BeanPropertySqlParameterSource(credit);
                GeneratedKeyHolder keyHolder = new GeneratedKeyHolder();
                NamedParameterJdbcTemplate namedParamJdbcTemplate = new NamedParameterJdbcTemplate(dataSource);
                namedParamJdbcTemplate.update(insertQuery, creditParameters, keyHolder, new String[]{"CREDITID"});
                String creditId = keyHolder.getKey().toString();

    return creditId;
    } 

记录已完美插入数据库。抛出以下异常

org.springframework.dao.DataRetrievalFailureException: The generated key is not of a supported numeric type. Unable to cast [java.lang.String] to [java.lang.Number]
    at org.springframework.jdbc.support.GeneratedKeyHolder.getKey(GeneratedKeyHolder.java:73)
    at com.bluebench.mediamanager.cmn.dao.crms.CreditDAO.insertCredit(CreditDAO.java:72)
    at com.bluebench.mediamanager.crms.service.CredentialManagementService.addCredit(CredentialManagementService.java:56)
    at com.bluebench.mediamanager.crms.controller.CredentialManagementController.addCredits(CredentialManagementController.java:59)

有没有办法检索主键值?

【问题讨论】:

    标签: java spring spring-jdbc jdbctemplate


    【解决方案1】:

    这是解决方案,而不是使用

    String creditId = keyHolder.getKey().toString();
    

    我们应该使用

    String creditId = (String) keyHolder.getKeys().get("CREDITID");
    

    真正的暗示来自未知先生。我不能接受您的回答,因为它不正确,但感谢您提示不同的方向。

    【讨论】:

    • 在我的情况下 GeneratedKeyHolder 的键为空
    猜你喜欢
    • 2013-10-20
    • 2017-08-09
    • 2015-05-10
    • 2012-01-04
    • 2019-07-08
    • 2012-10-07
    • 1970-01-01
    • 2013-05-28
    • 1970-01-01
    相关资源
    最近更新 更多