@Override protected String generateIdSubselect(Queryable persister, IdTableInfo idTableInfo) { return super.generateIdSubselect( persister, idTableInfo ) + " where " + SESSION_ID_COLUMN_NAME + "=?"; }
final String bulkTargetAlias = fromElement.getTableAlias(); final ProcessedWhereClause processedWhereClause = processWhereClause( deleteStatement.getWhereClause() ); this.idSelectParameterSpecifications = processedWhereClause.getIdSelectParameterSpecifications(); this.idInsertSelect = generateIdInsertSelect( bulkTargetAlias, idTableInfo, processedWhereClause ); log.tracev( "Generated ID-INSERT-SELECT SQL (multi-table delete) : {0}", idInsertSelect ); final String idSubselect = generateIdSubselect( targetedPersister, idTableInfo ); deletes = new ArrayList<>(); AbstractCollectionPersister cPersister = (AbstractCollectionPersister) factory.getMetamodel().collectionPersister( cType.getRole() ); if ( cPersister.isManyToMany() ) { deletes.add( generateDelete( cPersister.getTableName(), cPersister.getKeyColumnNames(), idSubselect, "bulk delete - m2m join table cleanup")); deletes.add( generateDelete( tableNames[i], columnNames[i], idSubselect, "bulk delete"));
@Override public int execute(SharedSessionContractImplementor session, QueryParameters queryParameters) { prepareForUse( targetedPersister, session ); try { PreparedStatement ps = null; ps = session.getJdbcCoordinator().getStatementPreparer().prepareStatement( idInsertSelect, false ); int position = 1; position += handlePrependedParametersOnIdSelection( ps, session, position ); for ( ParameterSpecification parameterSpecification : idSelectParameterSpecifications ) { position += parameterSpecification.bind( ps, queryParameters, session, position ); .getStatementPreparer() .prepareStatement( delete, false ); handleAddedParametersOnDelete( ps, session ); session.getJdbcCoordinator().getResultSetReturn().executeUpdate( ps ); releaseFromUse( targetedPersister, session );
private String generateDelete(String tableName, String[] columnNames, String idSubselect, String comment) { final Delete delete = new Delete() .setTableName( tableName ) .setWhere( "(" + String.join( ", ", columnNames ) + ") IN (" + idSubselect + ")" ); if ( factory().getSessionFactoryOptions().isCommentsEnabled() ) { delete.setComment( comment ); } return delete.toStatementString(); }