削除クエリ

行を削除するクエリを実行します。

int rows = new QContact()
  .name.equalTo("rob@foo.com")
  .delete();
delete from contact where email = ?
例 2
int rows = new QContact()
  .email.startsWith("rob")
  .firstName.eq("Rob")
  .delete();
delete from contact where email like ? escape'|'  and first_name = ?
例 3

where 式が *OneToMany* などの関連 Bean パスにある場合、SQL 削除はサブクエリを使用します。

int rows = new QCustomer()
  .contacts.email.contains("foo.com")
  .delete();
delete from customer where id in (
  select distinct t0.id
  from customer t0
  join contact u1 on u1.customer_id = t0.id
  where u1.email like ? escape'|'
)

カスケード削除

@ManyToOne(cascade=CascadeType.ALL) などによって削除される Bean タイプにカスケード削除が定義されている場合、カスケードは適用されます。

次の例では、Customer が save と delete を billingAddress にカスケードします。

// setup - a customer with a billing address
Customer customer = new Customer("Bad Example");
customer.setBillingAddress(new Address("My Street", "Hopeful City"));
customer.save();


// deleting customer needs to cascade delete the billingAddress
int rows = new QCustomer()
.name.startsWith("Bad")
.delete();

上記は最終的に、トランザクションで 4 つのステートメントを実行します。

-- first select the ids of customers that will be deleted
select t0.id from customer t0 where t0.name like ? escape'' ; --bind(Bad%)

-- select the foreign keys that will be cascade deleted
select t0.id, t0.billing_address_id, t0.shipping_address_id from customer t0 where t0.id in (? )

-- delete the customers
delete from customer where id=?;

-- [cascade] delete the related billing addresses
delete from address where id=?;

persistCascade false

トランザクションで persist カスケードが無効になっている場合、クエリは代わりに単一の削除ステートメントだけを実行します。

try (Transaction transaction = DB.beginTransaction()) {

  // turn off persist cascade
  transaction.setPersistCascade(false);

  int deletedRows =
    new QCustomer()
      .name.startsWith("Bad")
      .delete();

  transaction.commit();
}
delete from customer where name like ? escape'' ; --bind(Bad%)

SqlUpdate との比較

SQL を直接使用したい場合は、SqlUpdate を使用して sql delete ステートメントを実行できます。