2016-11-28 2 views
0

Ich habe ein Problem mit Soft-Löschen, wenn ich versuche, Zeilen auf der Grundlage mehrerer Parameter in @SqlDelete Anotation zu löschen.Hibernate - Soft Delete - Mehrere Parameter

Hier ist mein Code:

@Entity 
@Table(name = "department") 
@DynamicInsert 
@DynamicUpdate 
//Override the default Hibernation delete and set the deleted flag rather than deleting the record from the db. 
@SQLDelete(sql="UPDATE department SET valid_to = NOW(), active_f = 0 WHERE id = ? OR parent_department_id = ?") 
//Filter added to retrieve only records that have not been soft deleted. 
@Where(clause="valid_to IS NULL and active_f = 1") 
@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE) 
public class Department implements Serializable { 
    ... 
} 

Wenn ich diesen Code ausführen ich einen Fehler bekam:

Caused by: org.hibernate.exception.GenericJDBCException: could not execute statement at org.hibernate.exception.internal.StandardSQLExceptionConverter.convert(StandardSQLExceptionConverter.java:54) at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:126) at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:112) at org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.executeUpdate(ResultSetReturnImpl.java:211) at org.hibernate.engine.jdbc.batch.internal.NonBatchingBatch.addToBatch(NonBatchingBatch.java:62) at org.hibernate.persister.entity.AbstractEntityPersister.delete(AbstractEntityPersister.java:3400) at org.hibernate.persister.entity.AbstractEntityPersister.delete(AbstractEntityPersister.java:3630) at org.hibernate.action.internal.EntityDeleteAction.execute(EntityDeleteAction.java:114) at org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:465) at org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:351) at org.hibernate.event.internal.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:350) at org.hibernate.event.internal.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:56) at org.hibernate.internal.SessionImpl.flush(SessionImpl.java:1258) at org.hibernate.internal.SessionImpl.managedFlush(SessionImpl.java:425) at org.hibernate.engine.transaction.internal.jdbc.JdbcTransaction.beforeTransactionCommit(JdbcTransaction.java:101) at org.hibernate.engine.transaction.spi.AbstractTransactionImpl.commit(AbstractTransactionImpl.java:177) at org.hibernate.jpa.internal.TransactionImpl.commit(TransactionImpl.java:77) at org.springframework.orm.jpa.JpaTransactionManager.doCommit(JpaTransactionManager.java:517) ... 136 common frames omitted Caused by: java.sql.SQLException: Statement parameter 2 not set. at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:957) at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:896) at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:885) at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:860) at com.mysql.jdbc.ServerPreparedStatement.serverExecute(ServerPreparedStatement.java:1158) at com.mysql.jdbc.ServerPreparedStatement.executeInternal(ServerPreparedStatement.java:780) at com.mysql.jdbc.PreparedStatement.executeUpdateInternal(PreparedStatement.java:2073) at com.mysql.jdbc.PreparedStatement.executeUpdateInternal(PreparedStatement.java:2009) at com.mysql.jdbc.PreparedStatement.executeLargeUpdate(PreparedStatement.java:5094) at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:1994) at com.zaxxer.hikari.pool.ProxyPreparedStatement.executeUpdate(ProxyPreparedStatement.java:61) at com.zaxxer.hikari.pool.HikariProxyPreparedStatement.executeUpdate(HikariProxyPreparedStatement.java)

Hat keine Ahnung, jemand, wie dieses Problem beheben?
Vielen Dank im Voraus.

Antwort

1

Der Fehler wird ausgelöst, weil Sie mehr als einen Parameter in @SQLDelete-Annotation haben. Es gibt keine Möglichkeit, Parameter der @ SQLDelete-Abfrage festzulegen. Hibernate nimmt intern den Wert an, der während des Aufrufs von session.delete übergeben wurde.

Es ist keine gute Idee, eine Daten auf etwas anderes als Primärschlüssel zu löschen. Also, wenn Sie nur Folgendes verwenden, wird es wie ein Charme funktionieren.

@SQLDelete(sql="UPDATE department SET valid_to = NOW(), active_f = 0 WHERE id = ?") 
+0

Ich weiß, aber ich frage mich, gibt es eine Möglichkeit, das mit mehreren Parametern zu tun .... –

+0

Es gibt keine solche Möglichkeit, mehrere Parameter in @ SQLDelete zu implementieren :) – Avinash

0

Sie können @Where verwenden zusammen mit @SqlDelete dann aber die Bedingung u definieren, in denen würde verwendet werden, um alle Abfragen auszuführen. Nicht sicher, wie wir es @SqlDelete besonders machen können.