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.