oracle 12c+隐藏列默认不被select *返回,java jdbc必须显式写出列名才能查询或操作;其元数据中invisible='yes',访问时需注意大小写匹配、not null约束及orm映射显式声明。
oracle 12c+ 隐藏列默认不可见,java jdbc 必须显式指定列名
java 通过 jdbc 查询 oracle 隐藏列时,select * 不会返回 invisible 列,即使它们物理存在。这不是 jdbc 的限制,而是 oracle 的行为:隐藏列仅对元数据和 dml 语句“隐形”,但查询时仍需像普通列一样被显式写出。
常见错误现象:ResultSetMetaData.getColumnCount() 返回的列数少于实际表结构列数;用 rs.getString("col_name") 访问隐藏列时报 Invalid column name(如果该列未出现在 SELECT 子句中)。
- 必须在 SQL 中显式写出隐藏列名,例如
SELECT id, name, hidden_col FROM t - 不能依赖
SELECT *或ResultSetMetaData自动发现隐藏列 - Oracle 数据字典视图
ALL_TAB_COLUMNS中,INVISIBLE = 'YES'的列才属于隐藏列,可据此生成动态 SQL
PreparedStatement 中绑定隐藏列值需注意 NULL 和类型匹配
向含隐藏列的表执行 INSERT 或 UPDATE 时,若要写入隐藏列,SQL 中必须显式包含它,且 JDBC 参数绑定逻辑与普通列完全一致——但容易因忽略其 NOT NULL 约束或默认值设置而失败。
使用场景:批量导入时需为隐藏列(如审计字段 created_by)赋值;或启用隐藏列做灰度字段迁移。
- 插入示例:
INSERT INTO t (id, name, audit_flag) VALUES (?, ?, ?)——audit_flag是 invisible 列,但必须出现在列列表中 - 若隐藏列为
NOT NULL且无默认值,省略它会导致 ORA-01400 错误 - Oracle 对 invisible 列支持完整数据类型,JDBC 类型映射规则不变(如
setString()对应VARCHAR2)
ResultSet.getObject() 读取隐藏列需确保列名大小写与定义一致
Oracle 默认将未加引号的列名转为大写,但若建表时用双引号定义了小写或混合大小写的隐藏列名(如 "hiddenCol"),则 JDBC 中必须用完全匹配的字符串访问,否则报错。
性能影响:无额外开销;兼容性上,JDBC 驱动版本 ≥ 12.1.0.2 支持所有 invisible 列操作,旧驱动可能忽略元数据中的 INVISIBLE 标志但不影响显式访问。
- 建表时用了双引号:
ALTER TABLE t ADD ("myFlag" VARCHAR2(1) INVISIBLE)→ 读取时必须用rs.getString("myFlag"),不能用rs.getString("MYFLAG") - 未加引号的隐藏列(如
ADD hidden_flag NUMBER INVISIBLE)→ 统一用大写访问:rs.getBigDecimal("HIDDEN_FLAG") - 推荐统一用
rs.getObject(int columnIndex)避免大小写陷阱,前提是知道列序号
MyBatis 等 ORM 框架需手动维护隐藏列映射
MyBatis 的 <resultmap></resultmap> 和自动映射(autoMapping)默认不感知 invisible 属性,也不会从 SELECT * 中带出隐藏列。若 XML 或注解中未声明,即使数据库返回了该列,对象属性也不会被填充。
容易踩的坑:开发环境表结构未同步隐藏列,导致测试通过、生产报空指针;或 DTO 字段名与隐藏列名冲突但未显式排除。
- XML 映射中必须显式添加:
<result column="HIDDEN_COL" property="hiddenCol"></result> - 开启
autoMappingUnknownColumnBehavior为WARNING或FAIL可捕获漏映射 - 使用
@Select("SELECT id, name, hidden_col FROM t")替代@Select("SELECT * FROM t")
真正麻烦的不是语法,而是团队对“隐藏列”存在认知偏差:有人以为它彻底不可见,结果在 Java 层漏查漏写;也有人以为它自动参与所有操作,结果在迁移或审计时数据对不上。只要记住一点——invisible 只影响 SQL 解析器的默认列推导,不改变 JDBC 协议层的行为。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











