@Test
  public void testDeleteWithSubquery() {
    // setup the test data...
    Session s = openSession();
    s.beginTransaction();
    SimpleEntityWithAssociation owner = new SimpleEntityWithAssociation("myEntity-1");
    owner.addAssociation("assoc-1");
    owner.addAssociation("assoc-2");
    owner.addAssociation("assoc-3");
    s.save(owner);
    SimpleEntityWithAssociation owner2 = new SimpleEntityWithAssociation("myEntity-2");
    owner2.addAssociation("assoc-1");
    owner2.addAssociation("assoc-2");
    owner2.addAssociation("assoc-3");
    owner2.addAssociation("assoc-4");
    s.save(owner2);
    SimpleEntityWithAssociation owner3 = new SimpleEntityWithAssociation("myEntity-3");
    s.save(owner3);
    s.getTransaction().commit();
    s.close();

    // now try the bulk delete
    s = openSession();
    s.beginTransaction();
    int count =
        s.createQuery(
                "delete SimpleEntityWithAssociation e where size( e.associatedEntities ) = 0 and e.name like '%'")
            .executeUpdate();
    assertEquals("incorrect delete count", 1, count);
    s.getTransaction().commit();
    s.close();

    // finally, clean up
    s = openSession();
    s.beginTransaction();
    s.createQuery("delete SimpleAssociatedEntity").executeUpdate();
    s.createQuery("delete SimpleEntityWithAssociation").executeUpdate();
    s.getTransaction().commit();
    s.close();
  }
  @SuppressWarnings({"unchecked"})
  @Test
  public void testUpdateWithWhereExistsSubquery() {
    // multi-table ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    Session s = openSession();
    Transaction t = s.beginTransaction();
    Human joe = new Human();
    joe.setName(new Name("Joe", 'Q', "Public"));
    s.save(joe);
    Human doll = new Human();
    doll.setName(new Name("Kyu", 'P', "Doll"));
    doll.setFriends(new ArrayList());
    doll.getFriends().add(joe);
    s.save(doll);
    t.commit();
    s.close();

    s = openSession();
    t = s.beginTransaction();
    String updateQryString =
        "update Human h "
            + "set h.description = 'updated' "
            + "where exists ("
            + "      select f.id "
            + "      from h.friends f "
            + "      where f.name.last = 'Public' "
            + ")";
    int count = s.createQuery(updateQryString).executeUpdate();
    assertEquals(1, count);
    s.delete(doll);
    s.delete(joe);
    t.commit();
    s.close();

    // single-table (one-to-many & many-to-many) ~~~~~~~~~~~~~~~~~~~~~~~~~~
    s = openSession();
    t = s.beginTransaction();
    SimpleEntityWithAssociation entity = new SimpleEntityWithAssociation();
    SimpleEntityWithAssociation other = new SimpleEntityWithAssociation();
    entity.setName("main");
    other.setName("many-to-many-association");
    entity.getManyToManyAssociatedEntities().add(other);
    entity.addAssociation("one-to-many-association");
    s.save(entity);
    t.commit();
    s.close();

    s = openSession();
    t = s.beginTransaction();
    // one-to-many test
    updateQryString =
        "update SimpleEntityWithAssociation e "
            + "set e.name = 'updated' "
            + "where exists ("
            + "      select a.id "
            + "      from e.associatedEntities a "
            + "      where a.name = 'one-to-many-association' "
            + ")";
    count = s.createQuery(updateQryString).executeUpdate();
    assertEquals(1, count);
    // many-to-many test
    if (getDialect().supportsSubqueryOnMutatingTable()) {
      updateQryString =
          "update SimpleEntityWithAssociation e "
              + "set e.name = 'updated' "
              + "where exists ("
              + "      select a.id "
              + "      from e.manyToManyAssociatedEntities a "
              + "      where a.name = 'many-to-many-association' "
              + ")";
      count = s.createQuery(updateQryString).executeUpdate();
      assertEquals(1, count);
    }
    s.delete(entity.getManyToManyAssociatedEntities().iterator().next());
    s.delete(entity);
    t.commit();
    s.close();
  }