java - 将列更新为默认值而不在 Spring Data JPA 中指定它
问题描述
我希望为 DB 中定义的给定列设置默认值,如此处所述,而不是从我的应用程序中指定它。我希望 Oracle JDBC 生成以下内容;
UPDATE TABLE_X SET COLUMN_A = default WHERE ...
或者可能
UPDATE TABLE_X SET COLUMN_A = systimestamp WHERE ...
自从COLUMN_A TIMESTAMP WITH TIME ZONE DEFAULT systimestamp NOT NULL
当我为列指定默认值时,JDBC 以不需要的格式生成了字符串值,并且我无法自定义此行为,此处对此进行了解释。
有没有办法通过 Hibernate/JPA 触发这种行为?我试图规避在我的应用程序中定义默认值,但default
在 SQL 中使用关键字,以便使用来自 Oracle 端的预定义值。
我不想要数据库端的任何解决方案,但只适用于应用程序端。
解决方案
Oracle 中有一个特殊的视图,称为user_tab_cols
它包含有关列默认值的信息。
适用于 Oracle 的纯 SQL + PL/SQL 解决方案:
返回 data_default 所需的函数(PL/SQL 仅用于从LONG
to的转换VARCHAR2
):
create or replace FUNCTION get_column_data_default(
p_table_name VARCHAR2, p_column_name VARCHAR2
) RETURN VARCHAR2
AS
v_data_default_long LONG;
v_data_default_vc VARCHAR2(4000);
BEGIN
SELECT data_default
INTO v_data_default_long
FROM user_tab_cols
WHERE table_name = p_table_name
AND column_name = p_column_name
;
v_data_default_vc := SUBSTR(v_data_default_long, 1, 4000);
RETURN v_data_default_vc;
END get_column_data_default;
/
然后你可以写:
update TABLE_X
set COLUMN_A = get_column_data_default('TABLE_X ', 'COLUMN_A')
where ...
;
推荐阅读
- apache-spark - Pyspark 中数组元素上的 UDF
- spring-boot - 在类路径资源中定义名称为 'entityManagerFactory' 的 bean 和用户 @'localhost' 的访问被拒绝(使用密码:否)时出错
- r - 将两列数据框转换为 Quanteda 字典格式
- azure-data-factory - Azure 数据工厂中的链接活动问题
- r - 删除有条件的行
- r - 使用场景数据处理 lme 中的空间自相关(具有零距离的数据)
- java - 如何在地图中收集
> 在对象列表中的字段列表中? - xml - 如何在 DTD 文件中定义自关闭 XML 元素?
- angular - 如何在角度自举之前延迟加载配置?
- python - 您如何自动填写此字段(bizuser)ForeignKey 而不必寻找 bizuser ID