public void testAutoDetectAliasing() {
    Session s = openSession();
    Transaction t = s.beginTransaction();
    Organization ifa = new Organization("IFA");
    Organization jboss = new Organization("JBoss");
    Person gavin = new Person("Gavin");
    Employment emp = new Employment(gavin, jboss, "AU");
    Serializable orgId = s.save(jboss);
    Serializable orgId2 = s.save(ifa);
    s.save(gavin);
    s.save(emp);
    t.commit();
    s.close();

    s = openSession();
    t = s.beginTransaction();
    List list = s.createSQLQuery(getEmploymentSQL()).addEntity(Employment.class.getName()).list();
    assertEquals(1, list.size());

    Employment emp2 = (Employment) list.get(0);
    assertEquals(emp2.getEmploymentId(), emp.getEmploymentId());
    assertEquals(emp2.getStartDate().getDate(), emp.getStartDate().getDate());
    assertEquals(emp2.getEndDate(), emp.getEndDate());

    s.clear();

    list =
        s.createSQLQuery(getEmploymentSQL())
            .addEntity(Employment.class.getName())
            .setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP)
            .list();
    assertEquals(1, list.size());
    Map m = (Map) list.get(0);
    assertTrue(m.containsKey("Employment"));
    assertEquals(1, m.size());

    list = s.createSQLQuery(getEmploymentSQL()).list();
    assertEquals(1, list.size());
    Object[] o = (Object[]) list.get(0);
    assertEquals(8, o.length);

    list =
        s.createSQLQuery(getEmploymentSQL())
            .setResultTransformer(new UpperCasedAliasToEntityMapResultTransformer())
            .list();
    assertEquals(1, list.size());
    m = (Map) list.get(0);
    assertTrue(m.containsKey("EMPID"));
    assertTrue(m.containsKey("VALUE"));
    assertTrue(m.containsKey("ENDDATE"));
    assertEquals(8, m.size());

    list =
        s.createSQLQuery(getEmploymentSQLMixedScalarEntity())
            .addScalar("employerid")
            .addEntity(Employment.class)
            .list();
    assertEquals(1, list.size());
    o = (Object[]) list.get(0);
    assertEquals(2, o.length);
    assertClassAssignability(o[0].getClass(), Number.class);
    assertClassAssignability(o[1].getClass(), Employment.class);

    Query queryWithCollection = s.getNamedQuery("organizationEmploymentsExplicitAliases");
    queryWithCollection.setLong("id", jboss.getId());
    list = queryWithCollection.list();
    assertEquals(list.size(), 1);

    s.clear();

    list =
        s.createSQLQuery(getOrganizationJoinEmploymentSQL())
            .addEntity("org", Organization.class)
            .addJoin("emp", "org.employments")
            .list();
    assertEquals(2, list.size());

    s.clear();

    list =
        s.createSQLQuery(getOrganizationFetchJoinEmploymentSQL())
            .addEntity("org", Organization.class)
            .addJoin("emp", "org.employments")
            .list();
    assertEquals(2, list.size());

    s.clear();

    // TODO : why twice?
    s.getNamedQuery("organizationreturnproperty").list();
    list = s.getNamedQuery("organizationreturnproperty").list();
    assertEquals(2, list.size());

    s.clear();

    list = s.getNamedQuery("organizationautodetect").list();
    assertEquals(2, list.size());

    t.commit();
    s.close();

    s = openSession();
    t = s.beginTransaction();
    s.delete(emp2);

    s.delete(jboss);
    s.delete(gavin);
    s.delete(ifa);
    t.commit();
    s.close();

    s = openSession();
    t = s.beginTransaction();
    Dimension dim = new Dimension(3, Integer.MAX_VALUE);
    s.save(dim);
    list =
        s.createSQLQuery(
                "select d_len * d_width as surface, d_len * d_width * 10 as volume from Dimension")
            .list();
    s.delete(dim);
    t.commit();
    s.close();

    s = openSession();
    t = s.beginTransaction();
    SpaceShip enterprise = new SpaceShip();
    enterprise.setModel("USS");
    enterprise.setName("Entreprise");
    enterprise.setSpeed(50d);
    Dimension d = new Dimension(45, 10);
    enterprise.setDimensions(d);
    s.save(enterprise);
    Object[] result = (Object[]) s.getNamedQuery("spaceship").uniqueResult();
    enterprise = (SpaceShip) result[0];
    assertTrue(50d == enterprise.getSpeed());
    assertTrue(450d == extractDoubleValue(result[1]));
    assertTrue(4500d == extractDoubleValue(result[2]));
    s.delete(enterprise);
    t.commit();
    s.close();
  }