@Test
  public void testLeftJoinTwoColumns() throws Exception {
    Dao<Foo, Integer> fooDao = createDao(Foo.class, true);
    Dao<StringColumnArg, Integer> scaDao = createDao(StringColumnArg.class, true);

    Foo foo1 = new Foo();
    foo1.val = 123213213;
    foo1.stringField = "stuff";
    fooDao.create(foo1);

    StringColumnArg sca1 = new StringColumnArg();
    sca1.str1 = foo1.stringField;
    scaDao.create(sca1);

    StringColumnArg sca2 = new StringColumnArg();
    sca2.str1 = "something eles";
    scaDao.create(sca2);

    QueryBuilder<Foo, Integer> fooQb = fooDao.queryBuilder();
    QueryBuilder<StringColumnArg, Integer> scaQb = scaDao.queryBuilder();
    scaQb.join(StringColumnArg.STR1_FIELD, Foo.STRING_COLUMN_NAME, fooQb);
    List<StringColumnArg> results = scaQb.query();
    assertNotNull(results);
    assertEquals(1, results.size());
    assertEquals(sca1.id, results.get(0).id);

    scaQb.reset();
    scaQb.join(
        StringColumnArg.STR1_FIELD,
        Foo.STRING_COLUMN_NAME,
        fooQb,
        JoinType.LEFT,
        JoinWhereOperation.AND);
    results = scaQb.query();
    assertNotNull(results);
    assertEquals(2, results.size());
    assertEquals(sca1.id, results.get(0).id);
    assertEquals(sca2.id, results.get(1).id);
  }
  @Test
  public void testJoinTwoColumns() throws Exception {
    Dao<Foo, Integer> fooDao = createDao(Foo.class, true);
    Dao<StringColumnArg, Integer> scaDao = createDao(StringColumnArg.class, true);

    Foo foo1 = new Foo();
    foo1.val = 123213213;
    foo1.stringField = "stuff";
    fooDao.create(foo1);

    Foo foo2 = new Foo();
    foo2.stringField = "not stuff";
    fooDao.create(foo2);

    StringColumnArg sca1 = new StringColumnArg();
    sca1.str1 = foo1.stringField;
    scaDao.create(sca1);

    StringColumnArg sca2 = new StringColumnArg();
    sca2.str1 = foo2.stringField;
    scaDao.create(sca2);

    StringColumnArg sca3 = new StringColumnArg();
    sca3.str1 = "some other field";
    scaDao.create(sca3);

    QueryBuilder<Foo, Integer> fooQb = fooDao.queryBuilder();
    fooQb.where().eq(Foo.VAL_COLUMN_NAME, foo1.val);

    QueryBuilder<StringColumnArg, Integer> scaQb = scaDao.queryBuilder();
    scaQb.join(StringColumnArg.STR1_FIELD, Foo.STRING_COLUMN_NAME, fooQb);
    List<StringColumnArg> results = scaQb.query();
    assertNotNull(results);
    assertEquals(1, results.size());
    assertEquals(sca1.id, results.get(0).id);

    fooQb.reset();
    fooQb.where().eq(Foo.VAL_COLUMN_NAME, foo2.val);

    scaQb.reset();
    scaQb.join(StringColumnArg.STR1_FIELD, Foo.STRING_COLUMN_NAME, fooQb);
    results = scaQb.query();
    assertNotNull(results);
    assertEquals(1, results.size());
    assertEquals(sca2.id, results.get(0).id);
  }
  @Test
  public void testColumnArgString() throws Exception {
    Dao<StringColumnArg, Integer> dao = createDao(StringColumnArg.class, true);
    StringColumnArg foo1 = new StringColumnArg();
    String val = "3123123";
    foo1.str1 = val;
    foo1.str2 = val;
    assertEquals(1, dao.create(foo1));
    StringColumnArg foo2 = new StringColumnArg();
    foo2.str1 = val;
    foo2.str2 = val + "...";
    assertEquals(1, dao.create(foo2));

    QueryBuilder<StringColumnArg, Integer> qb = dao.queryBuilder();
    qb.where().eq(StringColumnArg.STR1_FIELD, new ColumnArg(StringColumnArg.STR2_FIELD));
    List<StringColumnArg> results = qb.query();
    assertNotNull(results);
    assertEquals(1, results.size());
    assertEquals(foo1.id, results.get(0).id);
  }