Strings do not support refactoring so you can choose to use the SQLBuilder class together with a bean proxy to build your queries. Then if you refactor any of your bean's properties, all your queries are also automatically updated. Below we give an example:
Post p = new Post(1); TableAlias<Post> postAlias = session.createTableAlias(Post.class, "p"); TableAlias<User> userAlias = session.createTableAlias(User.class, "u"); Post post = postAlias.pxy(); User user = userAlias.pxy(); SQLBuilder query = new SQLBuilder(256, postAlias, userAlias); query.append("select "); query.append(postAlias.columns()); query.append(", "); query.append(userAlias.columns()); query.append(" from ").append(postAlias.tableName()); query.append(" join ").append(userAlias.tableName()); query.append(" on "); query.column(post.getUserId()).append(" = ").column(user.getId()); query.append(" where "); query.column(post.getId()); query.append(" = ?"); stmt = SQLUtils.prepare(conn, query.toString(), p.getId()); rset = stmt.executeQuery(); if (rset.next()) { session.populateBean(rset, p, "p"); u = new User(); session.populateBean(rset, u, "u"); p.setUser(u); // manual lazy loading (we prefer to have control!) }