In my application I'm generating an SQL-INSERT. This insert will be executed as JPA native query (Hibernate) and automatically generate a new identity value in our SQL Server.
How can I receive the generated identity value?
I want to avoid to do a second select to @@IDENTITY
, because a second user could have inserted something in the meanwhile, leading to wrong results.
(seen in Getting generated identifier for JPA native insert query )
The code using @@IDENTITY looks like this:
Query statementInsert = entityManager.createNativeQuery("INSERT INTO x(colum1, column2) VALUES (:value1, :value2)");
// setting parameters...
statementInsert.executeUpdate();
Query statmentSelectId = entityManager.createNativeQuery("SELECT @@IDENTITY");
int generatedId = ((BigDecimal) statmentSelectId.getSingleResult()).intValueExact();
I would prefer to put SELECT SCOPE_IDENTITY()
right behind my INSERT
-Statement (as seen in
How to get Identity value from SQL server after insert record). This would require some kind of "batch execution" for JPA native queries.
I'm dreaming of something like this:
Query statementInsertAndSelectId = entityManager.createNativeQuery("INSERT INTO x(colum1, column2) VALUES (:value1, :value2); SELECT SCOPE_IDENTITY();");
// setting parameters...
// ?????????
int generatedId = ((BigDecimal) statementInsert.getSingleResult()); // not working, JPA complains about "No ResultSet"
Using "criteria builder" or "named query" is not possible in my project.