2013-04-18 4 views
2

Мы используем JPA для загрузки/сохранения наших объектов в базе данных простац. В одном случае я должен сохранить объект с собственным запросом. Heres это код:Невозможно вставить значения NULL в базу данных

String sql = "INSERT INTO recording (id,creationdate,duration,endtime,filemaninfocomplete,lastupdated,packagesdeletetime,rcinfocomplete," 
       + "rcrecordingkept,recordstate,recordingtype,starttime,tenantid,recordingnode_id,transcription_id) " 
       + "VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)"; 
Query query = getEntityManager().createNativeQuery(sql); 
query.setParameter(1, recording.getId()); 
query.setParameter(2, new Date(), TemporalType.TIMESTAMP); 
query.setParameter(3, recording.getDuration()); 
query.setParameter(4, recording.getEndtime(), TemporalType.TIMESTAMP); 
query.setParameter(5, recording.isFileManInfoComplete()); 
query.setParameter(6, new Date(), TemporalType.TIMESTAMP); 
query.setParameter(7, recording.getPackagesDeleteTime(), TemporalType.TIMESTAMP); 
query.setParameter(8, recording.isRcInfoComplete()); 
query.setParameter(9, recording.isRcRecordingKept()); 
query.setParameter(10,recording.getRecordState() != null ? recording.getRecordState().toString() : RecordState.DEFAULT); 
query.setParameter(11,recording.getRecordingType()!= null ? recording.getRecordingType().toString() : null); 
query.setParameter(12,recording.getStarttime(), TemporalType.TIMESTAMP);   
query.setParameter(13,recording.getTenantId());   
query.setParameter(14,recording.getRecordingNode() != null ? recording.getRecordingNode().getId() : null);   
query.setParameter(15, recording.getTranscription() != null ? recording.getTranscription().getId() : null);   
query.executeUpdate(); 

Вкладыш работает Finde, если "getPackagesDeleteTime" возвращает нуль. В этом случае следующее сообщение IST показано:

Caused by: org.postgresql.util.PSQLException: FEHLER: Spalte »packagesdeletetime« hat Typ timestamp without time zone, aber der Ausdruck hat Typ character varying 
    Hinweis: Sie müssen den Ausdruck umschreiben oder eine Typumwandlung vornehmen. 
    Position: 252 

(то есть:

ERROR: column "packagesdeletetime" has type timestamp without time zone, but the expression is of type character varying 
Hint: You must rewrite the expression or typecast. 

)

Сформирован Заявление выглядит следующим образом:

INSERT INTO recording(id,creationdate,duration,endtime,filemaninfocomplete,lastupdated,packagesdeletetime,rcinfocomplete,rcrecordingkept,recordstate,recordingtype,starttime,tenantid,recordingnode_id,transcription_id) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?) 
bind => [0c850391-cae9-4ac2-9381-b252167fa239, 2013-04-18 08:38:00.704, 20240, 2013-04-18 08:37:24.131, false, 2013-04-18 08:38:00.704, null, false, true, DEFAULT, VOICE, 2013-04-18 08:37:03.891, f56251a7-44df-4151-aa0d-7c3fc538f621, null, null] 

Некоторые советы, как я мог бы решить проблема?

+0

Просьба показать полную трассировку стека, версию поставщика JPA и поставщика, полный точный текст ошибки PostgreSQL (см. Журнал ошибок Pg, если он не находится в трассировке стека) и SQL, сгенерированный поставщиком JPA , –

+0

nullable true не работает. Херес StackTrace: Внутренняя Исключение: org.postgresql.util.PSQLException: Fehler: Spalte »packagesdeletetime« шапка Typ без метки времени часового пояса, Абер дер Ausdruck шляпа Typ характер изменения Hinweis: Sie Mussen ден Ausdruck umschreiben Одер Eine Typumwandlung vornehmen. и генерируемое Заявление Вставки: INSERT INTO записи (..., packagesdeletetime, ...) VALUES (? ...,, ...) \t привязывать => [..., пустой, .. .] –

+0

Когда я выполняю запрос в своем sql-редакторе, все работает нормально. Я думаю, что у этого парня такая же проблема: http://www.postgresql.org/message-id/[email protected] Сопоставление объектов в порядке. База данных говорит, что это нормально (при вставке с помощью инструмента запроса). Проблема возникает только в полях timestamp, когда я пытаюсь вставить нулевые значения. Мы используем eclipselink как поставщика. –

ответ

1

Соответствующее поле в объекте должно быть с аннотацией:

@Column (обнуляемым = истинный)

Также проверьте соответствующий столбец в вашей таблице позволяет NULL (не имеет ограничений NOT NULL). Если это не поможет, разместите код своего лица.

+0

Спасибо за ваш ответ. Я пытаюсь, но значение nullable = true - это значение по умолчанию. –