Как обрабатывать ненулевое поле в Java перед вставкой записи в таблицу - PullRequest
0 голосов
/ 25 сентября 2018

Я пытаюсь реализовать post запрос, используя spring data jpa.Я пытаюсь добавить новую комнату в таблицу комнат с некоторыми значениями.Некоторые столбцы из таблицы комнат не являются нулевыми. Я установил это по умолчанию.Но когда я вставляю, я получаю ошибку как violates not-null constraint.

Класс RoomService

// Add new Room Details
    public String addNewRoom(@RequestBody RoomInformation roomInfo) {

        Room roomRecord = new Room();

        if(roomInfo.nCampusId != 0)
        roomRecord.nCampusId = roomInfo.nCampusId;

        if(roomInfo.nBuildId != 0)
        roomRecord.nBuildId=roomInfo.nBuildId;

        if(roomInfo.nCRTCodeId !=0)
        roomRecord.nCRTCodeId=roomInfo.nCRTCodeId;

        roomRecord.nInstId=roomInfo.nInstId;
        roomRecord.sRoomNumber=roomInfo.sRoomNumber;
        roomRecord.sRoomDesc=roomInfo.sRoomDesc;
        roomRecord.nArea=roomInfo.nArea;
        roomRecord.sFloor=roomInfo.sFloor;
        roomRecord.bIsActive= true; 

        roomRepository.save(roomRecord);            

        return "New room added sucessfully";
    }

Таблица комнаты

CREATE TABLE public.room
(
    nroom_id numeric(18,0) NOT NULL DEFAULT nextval('room_seq'::regclass),
    ncampus_id numeric(18,0),
    nbuild_id numeric(18,0),
    ninst_id numeric(18,0) NOT NULL DEFAULT 0,
    sfloor character varying(10) COLLATE pg_catalog."default",
    sroom_number character varying(10) COLLATE pg_catalog."default",
    sroom_desc character varying(255) COLLATE pg_catalog."default",
    scomments text COLLATE pg_catalog."default",
    daccepted_date timestamp(3) without time zone,
    ssurveyor character varying(255) COLLATE pg_catalog."default",
    narea integer,
    ncrt_code_id numeric(18,0),
    ncmn_room_bln smallint,
    nunvalidated_bln smallint,
    sbfr_field character varying(50) COLLATE pg_catalog."default",
    ntemp_room_id numeric(18,0),
    bis_active boolean NOT NULL DEFAULT false,
    bis_jointuse boolean NOT NULL DEFAULT false,
    sstations_desc character varying(25) COLLATE pg_catalog."default",
    ddeleted_on timestamp(3) without time zone,
    ndeleted_by numeric(18,0),
    bis_incluster boolean NOT NULL DEFAULT false,
    bis_service_center_activity boolean NOT NULL DEFAULT false,
    service_center_comments text COLLATE pg_catalog."default",
    CONSTRAINT pk_roomdeails PRIMARY KEY (nroom_id),
        )

Ошибка на консоли

Нулевое значение в столбце "bis_jointuse" нарушает ненулевое ограничение

Detail: Failing row contains (1203521, 270, 11135, 106, 0, 10, abc, null, null, null, 22, 2122, null, null, null, null, t, null, null, null, null, null, null, null).

1 Ответ

0 голосов
/ 25 сентября 2018

Вам нужно пропустить столбец или указать ключевое слово DEFAULT вместо явного NULL:

INSERT INTO tab(col1,...,bis_jointuse)
VALUES (22, ..., DEFAULT);

-- skipping column
INSERT INTO tab(col1,...)
VALUES (22,...);

Эти значения не равны нулю в таблице, которую я установил с помощьюзначение по умолчанию.Но значение по умолчанию не принимается, когда я пытаюсь вставить.

Насколько мне известно, только Oracle поддерживает такую ​​конструкцию: Значения DEFAULT для явных значений NULL

В предыдущем разделе мы видели, что значения по умолчанию используются только тогда, когда на столбец нет ссылки в операторе вставки.Если на столбец ссылаются, даже при предоставлении значения NULL, значение по умолчанию не используется.Oracle 12c позволяет вам изменить это поведение, используя предложение ON NULL в определении по умолчанию.

CREATE TABLE t2 (
  col1        NUMBER DEFAULT 1,
  col2        NUMBER DEFAULT ON NULL 2, 
  description VARCHAR2(30)
);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...