java - 如何将 UUID 插入 RAW(16) 列
问题描述
我在 Oracle 中有 RAW(16) PK 列,并尝试使用 JDBC 将其插入:
PreparedStatement stmt = connection.prepareStatement("insert into COUNTRY (id, state, version, code, name, nationality, issuing_entity, country) values (?, ?, ?, ?, ?, ?, ?, ?)");
UUID id = UUID.randomUUID();
stmt.setObject(1, id, Types.BINARY);
但是,我遇到了一个例外:
java.sql.SQLException: Invalid column type
at oracle.jdbc.driver.OraclePreparedStatement.setObjectCritical(OraclePreparedStatement.java:8494)
at oracle.jdbc.driver.OraclePreparedStatement.setObjectInternal(OraclePreparedStatement.java:7995)
at oracle.jdbc.driver.OraclePreparedStatement.setObject(OraclePreparedStatement.java:8559)
at oracle.jdbc.driver.OraclePreparedStatementWrapper.setObject(OraclePreparedStatementWrapper.java:225)
at com.zaxxer.hikari.pool.HikariProxyPreparedStatement.setObject(HikariProxyPreparedStatement.java)
at rw.gov.dgie.framework.test.AbstractTestCaseWithDB.tryToInsertCountry(AbstractTestCaseWithDB.java:78)
at rw.gov.dgie.framework.test.AbstractTestCaseWithDB.dbSetup(AbstractTestCaseWithDB.java:62)
at test.rw.gov.dgie.bms.terr.service.TestCountryService.init(TestCountryService.java:37)
尝试使用 DbSetup 插入测试数据时,我遇到了同样的异常。
有没有办法让 JDBC 将 UUID 插入 RAW(16) 列?
我正在使用 Oracle JDBC 12.2.0.1.0。
解决方案
您必须将 UUID 转换为字节数组。看方法asBytes怎么做。
在它之后,绑定就像使用一样简单setBytes
。
例子
def stmt = con.prepareStatement("insert into TAB_UUID (id, uuid) values (?,?)")
// bind
stmt.setInt(1,1)
def uuid = UUID.randomUUID()
stmt.setBytes(2,asBytes(uuid))
def rowCount = stmt.executeUpdate()
这里只是以防万一链接不起作用 UUID 到字节数组的转换方法
public static byte[] asBytes(UUID uuid) {
ByteBuffer bb = ByteBuffer.wrap(new byte[16]);
bb.putLong(uuid.getMostSignificantBits());
bb.putLong(uuid.getLeastSignificantBits());
return bb.array();
}
推荐阅读
- bash - 如何使用 SSH 客户端在远程主机上运行本地代码?
- powershell - 在 Powershell 中使用 Grep 每分钟报告一次关键字的出现
- rundeck - RunDeck 的输入选项的最大长度是多少?
- postgresql - 更新和替换包含多个引号 postgresql 的字符串
- owl-carousel-2 - Owlcarousel 2 在窗口调整大小时调整大小(已编辑)
- google-analytics - 让子域在 Google Analytics 中显示为引荐
- javascript - Typescript - 基于字符串比较设置字符串的正确方法
- asp.net-core - 尝试通过 Azure AD B2C 进行身份验证并通过 AAD 中的组进行授权
- c++ - c++ - 在 lambda 中捕获完美转发的变量
- pointers - 调用 func 会返回哪个值