How to escape reserved words in Hibernate's HQL
Solution 1:
You could achieve it by a workaround using your custom "alias to map" transformer, so your code would change to something like this
Query q = mySession.createQuery(
"SELECT u.id AS id, u.name AS text, u AS obj FROM User u")
.setResultTransformer(
AliasToMapTransformer.renameAlias("obj", "object").build()
);
And then using this class:
public class AliasToMapTransformer extends BasicTransformerAdapter {
private Map<String, String> renameAliasMap;
public AliasToMapTransformer(Map<String, String> renameAliasMap) {
this.renameAliasMap = (renameAliasMap == null) ? Collections.<String, String>emptyMap() : renameAliasMap;
}
@Override
public Object transformTuple(Object[] tuple, String[] aliases) {
Map<String, Object> result = new HashMap<String, Object>(tuple.length);
for (int i = 0; i < tuple.length; i++) {
String alias = aliases[i];
if (alias != null) {
String newAlias = renameAliasMap.get(alias);
result.put((newAlias != null) ? newAlias : alias, tuple[i]);
}
}
return result;
}
public static Builder renameAlias(String alias, String newAlias) {
return new Builder().renameAlias(alias, newAlias);
}
public static class Builder {
private Map<String, String> aliasConversionMap = new HashMap<String, String>();
public Builder renameAlias(String alias, String newAlias) {
aliasConversionMap.put(alias, newAlias);
return this;
}
public AliasToMapTransformer build() {
return new AliasToMapTransformer(aliasConversionMap);
}
}
}
Solution 2:
On a related topic, escaping a reserved word in a column name is as easy as prepending with a table alias. No backticks, square brackets, etc. Simply replace
select where from mytable
by:
select t.where from mytable t
(note: i'm NOT saying it's a good idea to have "where" as column name ;-)
Solution 3:
the back tics concept works in hibernate.. unfortunately this only works if you've done annotation config...
you can try to do this in a different way (without annotations).
Query q = session.createQuery("select new User (u.id, u.name, u.object) from User u").list();
here you need to create a constructor in use which accepts an id, name, object elements & in that order.