@Test
  public void testQueryRawColumns() throws Exception {
    Dao<Foo, Integer> dao = createDao(Foo.class, true);
    Foo foo1 = new Foo();
    foo1.val = 1;
    foo1.equal = 10;
    assertEquals(1, dao.create(foo1));
    Foo foo2 = new Foo();
    foo2.val = 10;
    foo2.equal = 5;
    assertEquals(1, dao.create(foo2));
    QueryBuilder<Foo, Integer> qb = dao.queryBuilder();
    qb.selectRaw("COUNT(*)");
    GenericRawResults<String[]> rawResults = dao.queryRaw(qb.prepareStatementString());
    List<String[]> results = rawResults.getResults();
    assertEquals(1, results.size());
    // 2 rows inserted
    assertEquals("2", results.get(0)[0]);

    qb = dao.queryBuilder();
    qb.selectRaw("MIN(val)", "MAX(val)");
    rawResults = dao.queryRaw(qb.prepareStatementString());
    results = rawResults.getResults();
    assertEquals(1, results.size());
    String[] result = results.get(0);
    assertEquals(2, result.length);
    // foo1 has the maximum value
    assertEquals(Integer.toString(foo1.val), result[0]);
    // foo2 has the maximum value
    assertEquals(Integer.toString(foo2.val), result[1]);
  }
  @Test
  public void testOrderByRawAndOrderBy() throws Exception {
    Dao<Foo, Integer> dao = createDao(Foo.class, true);
    Foo foo1 = new Foo();
    foo1.val = 1;
    foo1.equal = 10;
    assertEquals(1, dao.create(foo1));
    Foo foo2 = new Foo();
    foo2.val = 5;
    foo2.equal = 7;
    assertEquals(1, dao.create(foo2));
    Foo foo3 = new Foo();
    foo3.val = 7;
    foo3.equal = 5;
    assertEquals(1, dao.create(foo3));
    List<Foo> results =
        dao.queryBuilder()
            .orderByRaw("(" + Foo.VAL_COLUMN_NAME + "+" + Foo.EQUAL_COLUMN_NAME + ") DESC")
            .query();
    assertEquals(3, results.size());
    assertEquals(foo2.id, results.get(0).id);
    assertEquals(foo3.id, results.get(1).id);
    assertEquals(foo1.id, results.get(2).id);

    results =
        dao.queryBuilder()
            .orderByRaw("(" + Foo.VAL_COLUMN_NAME + "+" + Foo.EQUAL_COLUMN_NAME + ") DESC")
            .orderBy(Foo.VAL_COLUMN_NAME, false)
            .query();
    assertEquals(3, results.size());
    assertEquals(foo3.id, results.get(0).id);
    assertEquals(foo2.id, results.get(1).id);
    assertEquals(foo1.id, results.get(2).id);

    results =
        dao.queryBuilder()
            .orderBy(Foo.VAL_COLUMN_NAME, true)
            .orderByRaw("(" + Foo.VAL_COLUMN_NAME + "+" + Foo.EQUAL_COLUMN_NAME + ") DESC")
            .query();
    assertEquals(3, results.size());
    assertEquals(foo1.id, results.get(0).id);
    assertEquals(foo2.id, results.get(1).id);
    assertEquals(foo3.id, results.get(2).id);
  }
  @Test
  public void testColumnArg() throws Exception {
    Dao<Foo, Integer> fooDao = createDao(Foo.class, true);
    Foo foo1 = new Foo();
    int val = 3123123;
    foo1.val = val;
    foo1.equal = val;
    assertEquals(1, fooDao.create(foo1));
    Foo foo2 = new Foo();
    foo2.val = val;
    foo2.equal = val + 1;
    assertEquals(1, fooDao.create(foo2));

    QueryBuilder<Foo, Integer> qb = fooDao.queryBuilder();
    qb.where().eq(Foo.VAL_COLUMN_NAME, new ColumnArg(Foo.EQUAL_COLUMN_NAME));
    List<Foo> results = qb.query();
    assertNotNull(results);
    assertEquals(1, results.size());
    assertEquals(foo1.id, results.get(0).id);
  }
 @Test
 public void testQueryRaw() throws Exception {
   Dao<Foo, Integer> dao = createDao(Foo.class, true);
   Foo foo = new Foo();
   foo.val = 1;
   foo.equal = 10;
   assertEquals(1, dao.create(foo));
   QueryBuilder<Foo, Integer> qb = dao.queryBuilder();
   qb.where().eq(Foo.VAL_COLUMN_NAME, new SelectArg());
   GenericRawResults<String[]> rawResults =
       dao.queryRaw(qb.prepareStatementString(), Integer.toString(foo.val));
   List<String[]> results = rawResults.getResults();
   assertEquals(1, results.size());
   boolean found = false;
   String[] columnNames = rawResults.getColumnNames();
   for (int i = 0; i < rawResults.getNumberColumns(); i++) {
     if (columnNames[i].equalsIgnoreCase(Foo.ID_COLUMN_NAME)) {
       assertEquals(Integer.toString(foo.id), results.get(0)[0]);
       found = true;
     }
   }
   assertTrue(found);
 }