Reputation: 745
I have to perform a bulk update on a table. Making a fast example :
UPDATE Book b SET b.amount = b.amount + 1 WHERE b IN ( :books )
The problem is that b.amount can be or a NULL value or an int, and if there is a NULL value it should behave as b.amount would be equal to 1.
Is there any "cast" in JPA/JPQL or any other way to work-around this problem,
Thank you in advance,
Regards, P
Upvotes: 4
Views: 4998
Reputation: 21
I used the following way to get the JDBC connection from the current JPA provider.
SessionImplementor si = (SessionImplementor) em.unwrap(Session.class);
Connection connection = si.getJdbcConnectionAccess().obtainConnection();
PreparedStatement pstmt = connection.prepareStatement("...");
// Do something
pstmt.addBatch();
pstmt.executeBatch();
si.getJdbcConnectionAccess().releaseConnection(connection);
Upvotes: 0
Reputation: 597076
I would go and fix the nulls first with a separate query:
UPDATE Book set b.amount = 0 WHERE b.amount IS NULL
And also make it impossible to insert null
, if it is not a legal value for your logic. For example have it @Column(nullable=false)
Upvotes: 1
Reputation: 242686
You should be able to use COALESCE
:
UPDATE Book b SET b.amount = COALESCE(b.amount, 1) + 1 WHERE b IN ( :books )
Upvotes: 7