@Test public void multipleKeys() { Map<String, Object> m = new HashMap<String, Object>() {{ put("key", 1); put("seq", 2); }}; kh.getKeyList().addAll(singletonList(m)); assertEquals("two keys should be in the map", 2, kh.getKeys().size()); exception.expect(InvalidDataAccessApiUsageException.class); exception.expectMessage(startsWith("The getKey method should only be used when a single key is returned.")); kh.getKey(); }
@Test public void multipleKeyRows() { Map<String, Object> m = new HashMap<String, Object>() {{ put("key", 1); put("seq", 2); }}; kh.getKeyList().addAll(asList(m, m)); assertEquals("two rows should be in the list", 2, kh.getKeyList().size()); exception.expect(InvalidDataAccessApiUsageException.class); exception.expectMessage(startsWith("The getKeys method should only be used when keys for a single row are returned.")); kh.getKeys(); }
throw new JdbcUpdateAffectedIncorrectNumberOfRowsException(CREATE_TAG_INODE_WITH_VALUE, 1, rc); return (Long) keyHolder.getKeys().get("itagid");
throw new JdbcUpdateAffectedIncorrectNumberOfRowsException(CREATE_TAG_INODE_WITHOUT_VALUE, 1, rc); return (Long) keyHolder.getKeys().get("itagid");
@Nullable private <S> Object getIdFromHolder(KeyHolder holder, RelationalPersistentEntity<S> persistentEntity) { try { // MySQL just returns one value with a special name return holder.getKey(); } catch (DataRetrievalFailureException | InvalidDataAccessApiUsageException e) { // Postgres returns a value for each column // MS SQL Server returns a value that might be null. Map<String, Object> keys = holder.getKeys(); if (keys == null || persistentEntity.getIdProperty() == null) { return null; } return keys.get(persistentEntity.getIdColumn()); } }
private <S> Object getIdFromHolder(KeyHolder holder, RelationalPersistentEntity<S> persistentEntity) { try { // MySQL just returns one value with a special name return holder.getKey(); } catch (InvalidDataAccessApiUsageException e) { // Postgres returns a value for each column Map<String, Object> keys = holder.getKeys(); if (keys == null || persistentEntity.getIdProperty() == null) { return null; } return keys.get(persistentEntity.getIdColumn()); } }
public <T> T generate(InsertContext insertContext) { KeyHolder keyHolder = new GeneratedKeyHolder(); jdbcTemplate.update(new PreparedStatementCreator() { public PreparedStatement createPreparedStatement(Connection con) throws SQLException { PreparedStatement ps = con.prepareStatement(insert.parsedSql(), tableMetaData.getKeyNames()); setParameterValues(ps, insert.getValues(), null); return ps; } }, keyHolder); Map keyMap = keyHolder.getKeys(); if (keyMap.size() > 1) { throw new InvalidDataAccessApiUsageException( "The method should only be used when a single key is returned"); } Iterator keyIter = keyMap.values().iterator(); if (keyIter.hasNext()) { return (T) keyIter.next(); } else { throw new DataRetrievalFailureException( "Unable to retrieve the generated key. " + "Check that the table has an identity column enabled."); } }
@SuppressWarnings("unchecked") private static <T> AffectedRowCountAndKey<T> executeUpdateAndKeepKeys( String template, Method method, NamedParameterJdbcTemplate jdbc, SqlParameterSource parameters) { Class<T> keyClass = (Class<T>) ((ParameterizedType) method.getGenericReturnType()).getActualTypeArguments()[0]; KeyHolder keyHolder = new GeneratedKeyHolder(); int result = jdbc.update(template, parameters, keyHolder); Map<String, Object> keys = keyHolder.getKeys(); Object key; if (keys.size() > 1) { AutoGeneratedKey spec = Objects.requireNonNull(withType(method.getDeclaredAnnotations(), AutoGeneratedKey.class), "more than one key for query " + template + ": annotation @AutoGeneratedKey required"); key = Objects.requireNonNull(keys.get(spec.value()), "the key with name " + spec.value() + " has returned null for query " + template + ": required a non null key"); } else if (Number.class.isAssignableFrom(keyClass)) { Class<? extends Number> c = (Class<? extends Number>) keyClass; return new AffectedRowCountAndKey<>(result, (T) NumberUtils.convertNumberToTargetClass(keyHolder.getKey(), c)); } else { key = keys.values().iterator().next(); } return new AffectedRowCountAndKey<>(result, keyClass.cast(key)); }
stat.setIno((Long) keyHolder.getKeys().get("inumber")); stat.setId(id); stat.setCrTime(now.getTime());