Как получить новый идентификатор записи после родной вставки - PullRequest
0 голосов
/ 27 апреля 2018

По ряду веских причин я делаю родную вставку данных jpa для данных.
Запрос выполняется правильно.
Но мне нужно только что сгенерированный идентификатор таблицы, сгенерированный nextval('hibernate_sequence')

Есть ли способ получить этот идентификатор?

Вот мой запрос:

/**
 * Inserts a new file attachment.
 * This is useful and maybe better suitable, because one may not want to load the whole
 * job offer to fullfill the JobOffer -> FileAttachment OneToMany Relation
 *
 * @param file       a given file
 * @param fileName   a given file name
 * @param jobOfferId a given job offer id
 * @return int the new id
 */
@Modifying
@Query(value = "insert into fileattachment(fileattachmentid, file, filename, joboffer_jobofferid) values (nextval('hibernate_sequence'), ?1, ?2, ?3);", nativeQuery = true)
int insertFileAttachment(String file, String fileName, long jobOfferId);

Возвращаемое значение int просто дает количество вставленных записей (1).
Но мне нужен новый идентификатор.
Я не хочу запрашивать его после вставки другим запросом к базе данных. Потому что, если мне нужно, вся нативная вставка устареет.

Кто-нибудь знает ответ / Есть ли у кого-нибудь альтернативные советы?
Спасибо!
С уважением
Томас

Редактировать
Я использую встроенную вставку, чтобы не загружать всю запись задания, которая представляет собой множество бесполезных данных, просто чтобы сохранить данные так, как это делается с помощью entitymanager.

Вместо этого я вставляю родные данные.

В любом случае, ваш отзыв о возвращаемых данных из операторов вставки был очень крут.
Я давал этому попытку, и это работает. Большое спасибо!
Я закончил с этим решением:

/**
 * Inserts a new file attachment.
 * This is useful and maybe better suitable, because one may not want to load the whole
 * job offer to fullfill the JobOffer -> FileAttachment OneToMany Relation
 *
 * @param file       a given file
 * @param fileName   a given file name
 * @param jobOfferId a given job offer id
 * @return int the new id
 */
@Query(value = "insert into fileattachment(fileattachmentid, file, filename, joboffer_jobofferid) values (nextval('hibernate_sequence'), ?1, ?2, ?3) returning fileattachmentid;", nativeQuery = true)
long insertFileAttachment(String file, String fileName, long jobOfferId);

1 Ответ

0 голосов
/ 27 апреля 2018

Есть ли способ получить этот идентификатор?

Не без запросов к БД там нет. Если вы не хотите использовать простой JDBC.

Если у вашего FileAttachment есть @ManyToOne JobOffer offer, почему бы вам просто не сделать следующее:

FileAttachment attachment = new FileAttachment(file, fileName);
attachment.setJobOffer(entityManager.getReference(JobOffer.class, jobOfferId));
entityManager.persist(attachment);
entityManager.flush();
return attachment.getId();

Таким образом, вы избежите загрузки всего состояния JobOffer. Если отношение однонаправленное, боюсь, вам придется получить весь JobOffer.

В качестве альтернативы, если вам действительно нужно использовать собственный INSERT, рассмотрите возможность определения хранимой процедуры в вашей БД, которая будет вставлять данные и возвращать автоматически сгенерированный идентификатор (см. здесь ).

Кроме того, некоторые базы данных (например, PostgreSQL) позволяют возвращать данные из операторов INSERT (INSERT (..) INTO FILEATTACHMENT RETURNING ID). Возможно, вам понадобится удалить аннотацию @Modifying, так как вставленный идентификатор окажется в результирующем наборе запроса. Вы не упомянули, какую БД вы использовали, но синтаксис выглядит как Postgres, поэтому я выбрал этот пример. Если вы используете другую БД, обратитесь к документации, возможно, есть похожая функция.

Однако я бы по-прежнему рекомендовал не использовать собственные операторы INSERT в JPA-приложении. Многие вещи могут сломаться. Я подозреваю, что метод, который вы пытаетесь реализовать, не является частью большой единицы работы, но если бы это было так, я был бы очень осторожен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...