protected void clear() {
    UnitOfWork uow = acquireUnitOfWork();

    // use alternate way for Symfoware as it doesn't support UpdateAll/DeleteAll on multi-table
    // objects (see rfe 298193)
    if (!(JUnitTestCase.getServerSession("fieldaccess")).getPlatform().isSymfoware()) {
      UpdateAllQuery updateEmployees = new UpdateAllQuery(Employee.class);
      updateEmployees.addUpdate("manager", null);
      updateEmployees.addUpdate("address", null);
      uow.executeQuery(updateEmployees);

      uow.executeQuery(new DeleteAllQuery(Employee.class));
    } else {
      Iterator<Employee> emps = uow.readAllObjects(Employee.class).iterator();
      while (emps.hasNext()) {
        Employee emp = emps.next();
        emp.setManager(null);
        emp.setAddress(null);
        uow.deleteObject(emp);
      }
      ;
    }

    UpdateAllQuery updateProjects = new UpdateAllQuery(Project.class);
    updateProjects.addUpdate("teamLeader", null);
    uow.executeQuery(updateProjects);

    uow.executeQuery(new DeleteAllQuery(PhoneNumber.class));
    uow.executeQuery(new DeleteAllQuery(Address.class));
    uow.executeQuery(new DeleteAllQuery(Project.class));

    uow.commit();
    dbSessionClearCache();
  }
    /** {@inheritDoc} */
    @Override
    public void visit(UpdateStatement expression) {

      UpdateAllQuery query = queryContext.getDatabaseQuery();

      // Create and prepare the query
      if (query == null) {
        query = new UpdateAllQuery();
        queryContext.setDatabasQuery(query);
        query.setJPQLString(jpqlQuery);
        ((JPQLCallQueryMechanism) query.getQueryMechanism()).getJPQLCall().setIsParsed(true);
      }

      query.setSession(queryContext.getSession());
      query.setShouldDeferExecutionInUOW(false);

      // Now populate it
      UpdateQueryVisitor visitor = new UpdateQueryVisitor(queryContext, query);
      expression.accept(visitor);
    }
 // Note: Update all for Table Per class only works with the one single
 // reference class. So it's not a full feature test.
 public void testUpdateAllQuery() {
   EntityManager em = createEntityManager();
   beginTransaction(em);
   try {
     ExpressionBuilder eb = new ExpressionBuilder();
     UpdateAllQuery updateQuery = new UpdateAllQuery(Assassin.class);
     updateQuery.addUpdate(eb.get("name"), "Generic Assassin Name");
     ((JpaEntityManager) em.getDelegate()).getServerSession().executeQuery(updateQuery);
     Assassin assassin = (Assassin) em.find(ContractedPersonel.class, assassinId);
     em.refresh(assassin);
     commitTransaction(em);
     assertTrue("Update all did not work", assassin.getName().equals("Generic Assassin Name"));
   } catch (Exception e) {
     e.printStackTrace();
     fail("Error issuing update all contracted personel query: " + e.getMessage());
   } finally {
     if (isTransactionActive(em)) {
       rollbackTransaction(em);
     }
     closeEntityManager(em);
   }
 }
  public void testTwoUnrelatedResultWithOneToOneJoinsWithExtraItem() {
    if (getServerSession("fieldaccess").getPlatform().isSymfoware()) {
      getServerSession("fieldaccess")
          .logMessage(
              "Test testTwoUnrelatedResultWithOneToOneJoinsWithExtraItem skipped for this platform, "
                  + "Symfoware doesn't support UpdateAll/DeleteAll on multi-table objects (see rfe 298193).");
      return;
    }
    ReadAllQuery raq = new ReadAllQuery(Employee.class);
    raq.setSelectionCriteria(
        raq.getExpressionBuilder()
            .get("lastName")
            .equal("Way")
            .or(raq.getExpressionBuilder().get("lastName").equal("Jones")));
    Employee emp = (Employee) ((Vector) getDbSession().executeQuery(raq)).firstElement();
    emp.getAddress();

    raq = new ReadAllQuery(Address.class);
    raq.setSelectionCriteria(raq.getExpressionBuilder().get("city").like("%ttawa%"));
    Address addr = (Address) ((Vector) getDbSession().executeQuery(raq)).firstElement();
    addr.getEmployees();
    for (Iterator iterator = addr.getEmployees().iterator(); iterator.hasNext(); ) {
      ((Employee) iterator.next()).getAddress();
    }

    getDbSession().getIdentityMapAccessor().initializeAllIdentityMaps();

    ReportQuery query = new ReportQuery();
    query.setShouldReturnWithoutReportQueryResult(true);
    query.setReferenceClass(Employee.class);

    ExpressionBuilder eb = new ExpressionBuilder(Address.class);
    query.setSelectionCriteria(
        query
            .getExpressionBuilder()
            .get("id")
            .equal(emp.getId())
            .and(eb.get("id").equal(addr.getId())));

    List list = new ArrayList();
    list.add(query.getExpressionBuilder().get("address"));
    query.addItem("employee", query.getExpressionBuilder(), list);
    query.addItem("employee_name", query.getExpressionBuilder().get("firstName"));

    list = new ArrayList();
    list.add(eb.anyOf("employees"));
    query.addItem("address", eb, list);

    Vector result = (Vector) getDbSession().executeQuery(query);

    UpdateAllQuery updall = new UpdateAllQuery(Employee.class);
    updall.addUpdate("address", null);
    updall.setSelectionCriteria(updall.getExpressionBuilder().get("id").equal(emp.getId()));
    UnitOfWork uow = getDbSession().acquireUnitOfWork();
    uow.executeQuery(updall);

    updall = new UpdateAllQuery(Employee.class);
    updall.addUpdate("address", null);
    updall.setSelectionCriteria(
        updall.getExpressionBuilder().get("address").get("id").equal(addr.getId()));
    uow.executeQuery(updall);

    uow.commit();

    Employee emp2 = (Employee) ((Object[]) result.firstElement())[0];
    Address addr2 = (Address) ((Object[]) result.firstElement())[2];
    try {
      assertTrue(
          "Address were not joined correctly, emp.getAddress() = null",
          (emp2.getAddress() != null));
      assertTrue(
          "Employees were not joined correctly, addr.employees.size = "
              + addr.getEmployees().size()
              + "addr2.employees.size = "
              + addr2.getEmployees().size(),
          (addr.getEmployees().size() == addr2.getEmployees().size()));
      if (!emp2.getFirstName().equals(((Object[]) result.firstElement())[1])) {
        fail("Failed to return employee name as an separate item");
      }

    } finally {
      testSetup();
    }
  }
  public void testMultipleUnrelatedResultWithOneToManyJoins() {
    if (getServerSession("fieldaccess").getPlatform().isSymfoware()) {
      getServerSession("fieldaccess")
          .logMessage(
              "Test testMultipleUnrelatedResultWithOneToManyJoins skipped for this platform, "
                  + "Symfoware doesn't support UpdateAll/DeleteAll on multi-table objects (see rfe 298193).");
      return;
    }
    ReadAllQuery raq = new ReadAllQuery(Employee.class);
    raq.setSelectionCriteria(raq.getExpressionBuilder().notEmpty("phoneNumbers"));
    Employee emp = (Employee) ((Vector) getDbSession().executeQuery(raq)).firstElement();
    emp.getPhoneNumbers();
    for (Iterator iterator = emp.getPhoneNumbers().iterator(); iterator.hasNext(); ) {
      ((PhoneNumber) iterator.next()).getOwner();
    }

    raq = new ReadAllQuery(Address.class);
    raq.setSelectionCriteria(raq.getExpressionBuilder().get("city").like("%ttawa%"));
    Address addr = (Address) ((Vector) getDbSession().executeQuery(raq)).firstElement();
    addr.getEmployees();
    for (Iterator iterator = addr.getEmployees().iterator(); iterator.hasNext(); ) {
      Employee addrEmp = (Employee) iterator.next();
      addrEmp.getAddress();
      addrEmp
          .getPhoneNumbers()
          .size(); // as the report query will join in all phones to all emps, make sure we can
                   // compare.
    }

    getDbSession().getIdentityMapAccessor().initializeAllIdentityMaps();

    ReportQuery query = new ReportQuery();
    query.setShouldReturnWithoutReportQueryResult(true);
    query.setReferenceClass(Address.class);

    ExpressionBuilder eb = new ExpressionBuilder(Employee.class);

    List list = new ArrayList();
    list.add(eb.anyOf("phoneNumbers"));
    query.addItem("employee", eb, list);

    list = new ArrayList();
    list.add(query.getExpressionBuilder().anyOf("employees"));
    query.addItem("address", query.getExpressionBuilder(), list);

    query.setSelectionCriteria(query.getExpressionBuilder().get("id").equal(addr.getId()));

    Vector result = (Vector) getDbSession().executeQuery(query);

    DeleteAllQuery deleteAll = new DeleteAllQuery(PhoneNumber.class);
    deleteAll.setSelectionCriteria(
        deleteAll.getExpressionBuilder().get("owner").get("id").equal(emp.getId()));
    UnitOfWork uow = getDbSession().acquireUnitOfWork();
    uow.executeQuery(deleteAll);

    UpdateAllQuery updall = new UpdateAllQuery(Employee.class);
    updall.addUpdate("address", null);
    updall.setSelectionCriteria(
        updall.getExpressionBuilder().get("address").get("id").equal(addr.getId()));
    uow.executeQuery(updall);

    uow.commit();

    try {
      Employee emp2 = null;
      Address addr2 = null;
      for (Iterator iterator = result.iterator(); iterator.hasNext(); ) {
        Object[] items = (Object[]) iterator.next();
        emp2 = (Employee) items[0];
        if (emp2.getId().equals(emp.getId())) {
          addr2 = (Address) items[1];
          break;
        }
      }
      assertTrue(
          "PhoneNumbers were not joined correctly, emp.getPhoneNumbers().size = "
              + emp.getPhoneNumbers().size()
              + " emp2.getPhoneNumbers().size = "
              + emp2.getPhoneNumbers().size(),
          (emp.getPhoneNumbers().size() == emp2.getPhoneNumbers().size()));
      assertTrue(
          "Employees were not joined correctly, addr.employees.size = "
              + addr.getEmployees().size()
              + "addr2.employees.size = "
              + addr2.getEmployees().size(),
          (addr.getEmployees().size() == addr2.getEmployees().size()));
    } finally {
      testSetup();
    }
  }