/// <summary> /// Generate the SQL DELETE that deletes all rows /// </summary> /// <returns></returns> protected override SqlString GenerateDeleteString() { SqlDeleteBuilder delete = new SqlDeleteBuilder(factory) .SetTableName(qualifiedTableName) .SetIdentityColumn(KeyColumnNames, KeyType); if (HasWhere) { delete.AddWhereFragment(sqlWhereString); } return(delete.ToSqlString()); }
// Generate all the SQL /// <summary> /// Generate the SQL that deletes a row by id (and version) /// </summary> /// <returns>A SqlString for a Delete</returns> protected virtual SqlString GenerateDeleteString() { SqlDeleteBuilder deleteBuilder = new SqlDeleteBuilder(factory); deleteBuilder.SetTableName(TableName) .SetIdentityColumn(IdentifierColumnNames, IdentifierType); if (IsVersioned) { deleteBuilder.SetVersionColumn(new string[] { VersionColumnName }, VersionType); } return(deleteBuilder.ToSqlString()); }
/// <summary> /// Generate the SQL DELETE that deletes a particular row /// </summary> /// <returns></returns> protected override SqlString GenerateDeleteRowString() { SqlDeleteBuilder delete = new SqlDeleteBuilder(factory); delete.SetTableName(qualifiedTableName); if (hasIdentifier) { delete.AddWhereFragment(rowSelectColumnNames, rowSelectType, " = "); } else { delete.AddWhereFragment(KeyColumnNames, KeyType, " = ") .AddWhereFragment(rowSelectColumnNames, rowSelectType, " = "); } return(delete.ToSqlString()); }
public MultiTableDeleteExecutor(IStatement statement) : base(statement, log) { if (!Factory.Dialect.SupportsTemporaryTables) { throw new HibernateException("cannot perform multi-table deletes using dialect not supporting temp tables"); } var deleteStatement = (DeleteStatement)statement; FromElement fromElement = deleteStatement.FromClause.GetFromElement(); string bulkTargetAlias = fromElement.TableAlias; persister = fromElement.Queryable; idInsertSelect = GenerateIdInsertSelect(persister, bulkTargetAlias, deleteStatement.WhereClause); log.Debug("Generated ID-INSERT-SELECT SQL (multi-table delete) : {0}", idInsertSelect); string[] tableNames = persister.ConstraintOrderedTableNameClosure; string[][] columnNames = persister.ConstraintOrderedTableKeyColumnClosure; string idSubselect = GenerateIdSubselect(persister); deletes = new SqlString[tableNames.Length]; for (int i = tableNames.Length - 1; i >= 0; i--) { // TODO : an optimization here would be to consider cascade deletes and not gen those delete statements; // the difficulty is the ordering of the tables here vs the cascade attributes on the persisters -> // the table info gotten here should really be self-contained (i.e., a class representation // defining all the needed attributes), then we could then get an array of those SqlDeleteBuilder delete = new SqlDeleteBuilder(Factory.Dialect, Factory) .SetTableName(tableNames[i]) .SetWhere("(" + string.Join(", ", columnNames[i]) + ") IN (" + idSubselect + ")"); if (Factory.Settings.IsCommentsEnabled) { delete.SetComment("bulk delete"); } deletes[i] = delete.ToSqlString(); } }