Delete

Annotate a Dao method with @Delete to execute delete operations.

@Dao
public interface EmployeeDao {
    @Delete
    int delete(Employee employee);
}

By default, the DELETE statement is automatically generated. You can map to an arbitrary SQL file by setting the sqlFile property to true in the @Delete annotation.

If an entity listener is specified for the entity class parameter, its preDelete method is called before executing the delete operation. Similarly, the postDelete method is called after the delete operation completes.

Return value

When using the returning property

See returning.

When not using the returning property

If the parameter is an immutable entity class, the return value must be org.seasar.doma.jdbc.Result with the entity class as its element.

If the above condition is not met, the return value must be int, which represents the number of rows affected by the delete operation.

Delete by auto generated SQL

The parameter type must be an entity class. Only one parameter can be specified. The parameter must not be null.

@Delete
int delete(Employee employee);

@Delete
Result<ImmutableEmployee> delete(ImmutableEmployee employee);

Version number and optimistic concurrency control in auto generated SQL

Optimistic concurrency control is executed if you satisfied below conditions.

  • Entity class within parameter has property that is annotated with @Version

  • The ignoreVersion element within @Delete annotation is false

If optimistic concurrency control is enabled, the version number is included with the identifier in the delete condition. OptimisticLockException representing optimistic concurrency control failure is thrown if the delete count is 0.

ignoreVersion

If the ignoreVersion property of the @Delete annotation is set to true, the version number is not included in the delete condition. In this case, OptimisticLockException is not thrown even if no rows are deleted.

@Delete(ignoreVersion = true)
int delete(Employee employee);

suppressOptimisticLockException

If the suppressOptimisticLockException property of the @Delete annotation is set to true, the version number is included in the delete condition. However, OptimisticLockException is not thrown even if the delete count is 0.

@Delete(suppressOptimisticLockException = true)
int delete(Employee employee);

returning

By specifying @Returning in the returning property, you can generate SQL equivalent to the DELETE .. RETURNING clause.

@Dao
public interface EmployeeDao {
    @Delete(returning = @Returning)
    Employee delete(Employee employee);

    @Delete(returning = @Returning(include = { "employeeId", "version" }))
    Employee deleteReturningIdAndVersion(Employee employee);

    @Delete(returning = @Returning(exclude = { "password" }))
    Employee deleteReturningExceptPassword(Employee employee);

    @Delete(returning = @Returning, suppressOptimisticLockException = true)
    Optional<Employee> deleteOrIgnore(Employee employee);
}

You can use the include element of @Returning to specify which entity properties (corresponding to database columns) should be returned by the RETURNING clause. Alternatively, you can use the exclude element to specify which properties should not be returned. If the same entity property is included in both include and exclude elements, it will not be returned.

The return type must be either an entity class or an Optional containing an entity class as its element.

Note

Only H2 Database, PostgreSQL, SQL Server, and SQLite Dialects support this feature.

Delete by SQL file

To execute a delete operation using a SQL file, set the sqlFile property to true in the @Delete annotation and prepare a corresponding SQL file for the method.

You can use any type as a parameter. There is no limit to the number of parameters you can specify. You can pass null to parameters of basic type or domain class. For other types, parameters must not be null.

Entity listener method is not called even if the entity listener is specified to entity.

@Delete(sqlFile = true)
int delete(Employee employee);

For example, you describe SQL file like below to correspond above method.

delete from employee where name = /* employee.name */'hoge'

Version number and optimistic concurrency control in SQL File

Optimistic concurrency control is performed when the following conditions are met:

  • Entity class is included in parameter

  • Entity class at first from the left within parameter has property that is annotated with @Version

  • The ignoreVersion property within @Delete annotation is false

  • The suppressOptimisticLockException property within @Delete annotation is false

However, describing to SQL file for Optimistic concurrency control SQL is application developer’s responsibility. For example like below SQL, you must specify version number in WHERE clauses.

delete from EMPLOYEE where ID = /* employee.id */1 and VERSION = /* employee.version */1

OptimisticLockException representing optimistic concurrency control failure is thrown, if this SQL delete count is 0. OptimisticLockException is not thrown if delete count is not 0.

ignoreVersion

If the ignoreVersion property of the @Delete annotation is set to true, OptimisticLockException is not thrown even if the delete count is 0.

@Delete(sqlFile = true, ignoreVersion = true)
int delete(Employee employee);

suppressOptimisticLockException

If the suppressOptimisticLockException property of the @Delete annotation is set to true, OptimisticLockException is not thrown even if the delete count is 0.

@Delete(sqlFile = true, suppressOptimisticLockException = true)
int delete(Employee employee);

Query timeout

You can specify seconds of query timeout to queryTimeout property within @Delete annotation.

@Delete(queryTimeout = 10)
int delete(Employee employee);

This specifying is applied regardless of with or without using sql file. Query timeout that is specified in Configuration is used if queryTimeout property is not set value.

SQL log output format

You can specify SQL log output format to sqlLog property within @Delete annotation.

@Delete(sqlLog = SqlLogType.RAW)
int delete(Employee employee);

SqlLogType.RAW represent outputting log that is sql with a binding parameter.