|
|
@@ -16,6 +16,7 @@
|
|
|
|
|
|
package com.jfinal.plugin.activerecord.dialect;
|
|
|
|
|
|
+import java.math.BigInteger;
|
|
|
import java.sql.Connection;
|
|
|
import java.sql.PreparedStatement;
|
|
|
import java.sql.ResultSet;
|
|
|
@@ -92,6 +93,8 @@ public abstract class Dialect {
|
|
|
model.set(pKey, rs.getInt(1));
|
|
|
} else if (colType == Long.class || colType == long.class) {
|
|
|
model.set(pKey, rs.getLong(1));
|
|
|
+ } else if (colType == BigInteger.class) {
|
|
|
+ processGeneratedBigIntegerKey(model, pKey, rs.getObject(1));
|
|
|
} else {
|
|
|
model.set(pKey, rs.getObject(1)); // It returns Long for int colType for mysql
|
|
|
}
|
|
|
@@ -103,6 +106,22 @@ public abstract class Dialect {
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
+ * mysql 数据库的 bigint unsigned 对应的 java 类型为 BigInteger
|
|
|
+ * 但是 rs.getObject(1) 返回值为 Long 型,造成 model.save() 以后
|
|
|
+ * model.getId() 时的类型转换异常
|
|
|
+ */
|
|
|
+ protected void processGeneratedBigIntegerKey(Model<?> model, String pKey, Object v) {
|
|
|
+ if (v instanceof BigInteger) {
|
|
|
+ model.set(pKey, (BigInteger)v);
|
|
|
+ } else if (v instanceof Number) {
|
|
|
+ Number n = (Number)v;
|
|
|
+ model.set(pKey, BigInteger.valueOf(n.longValue()));
|
|
|
+ } else {
|
|
|
+ model.set(pKey, v);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
* 用于获取 Db.save(tableName, record) 以后自动生成的主键值,可通过覆盖此方法实现更精细的控制
|
|
|
* 目前只有 PostgreSqlDialect,覆盖过此方法
|
|
|
*/
|