SQL refatorável com o MentaBean (best of both worlds)

Acredito que chegamos ao melhor de ambos os mundos com o MentaBean, isto é:

:arrow: SQL para quem gosta de trabalhar com SQL sem as enrolações do HQL, Criteria, etc.

:arrow: Apesar de vc construir uma String com a sua sql query, os campos dessa string são refatoráveis, ou seja, trocou o nome de um campo, todas as suas queries são atualizadas automaticamente. Adicionou/removeu uma propriedade do seu bean? Sem problemas, todas as suas queries são atualizadas automaticamente quando vc faz o refactor.

Exemplo:

Connection conn = getConnection();
BeanSession session = new MySQLBeanSession(mgr, conn);
  
PreparedStatement stmt = null;
ResultSet rset = null;
  
try {
     
    TableAlias<User> userAlias = session.createTableAlias(User.class);
    User user = userAlias.proxy();
      
    SQLBuilder sql = new SQLBuilder(1024, userAlias);
    sql.append("select ");
    sql.append(userAlias.columns());
    sql.append(" from ").append(userAlias.tableName());
    sql.append(" where ").column(user.getStatus()).append(" = ? and ").column(user.isDeleted()).append(" = ?"); // the interesting part...
      
    stmt = SQLUtils.prepare(conn, sql.toString(), Status.GOLD.toString(), 1); // varargs for params
  
    rset = stmt.executeQuery();
      
    List<User> users = new LinkedList<User>();
      
    while(rset.next()) {
        User u = new User();
        session.populateBean(rset, u);
        users.add(u);
    }
  
    System.out.println("Number of users loaded: " + users.size());
      
} finally {
    SQLUtils.close(rset, stmt, conn); // you can also statically import SQLUtils.*
}

Lembrando que o MentaBean é só para aqueles que desejam fugir do hibernate.