I am trying to figure this out as well. Looking at the code, it just does a string replace on {alias} and there are no real smarts to it.
I've tried doing something like the following, where I try to get the alias, but it would seem that the word Alias is used all over the place for different purposes in the Criteria API.
Code:
Criteria rootCrit = session.createCriteria(Foo.class);
Criteria subCrit = root.createCriteria(Child.class);
rootCrit.setProjection(Projections.sqlProjection(String.format("case when %s.FIELD > 99 then 1 else 0 end as flag", subCrit.getAlias()), new String[] {"flag"}, new Type[] {Hibernate.INTEGER}));