首页 > 解决方案 > 将列更新为默认值而不在 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 端的预定义值。

我不想要数据库端的任何解决方案,但只适用于应用程序端。

标签: javasqlhibernatejdbcspring-data-jpa

解决方案


Oracle 中有一个特殊的视图,称为user_tab_cols它包含有关列默认值的信息。

适用于 Oracle 的纯 SQL + PL/SQL 解决方案:

返回 data_default 所需的函数(PL/SQL 仅用于从LONGto的转换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 ...
;

推荐阅读