I'm sure I wasn't the only one that was sorely disappointed when Adobe released CF9 without the ability to execute HQL queries via the CFQUERY tag. Using a function (ormExecuteQuery) works, but it's really ungainly if you have complex – or even just long – HQL or need to build your statement conditionally, and you can't get syntax highlighting/code completion. Being one to solve the Hibernate problem myself (I've been using Hibernate on CF8 for years via CFGroovy), I wrote a couple really simple custom tags to give me the functionality. Pure CFML, 14 lines total. Yes, 14 lines.
First, the query tag:
<cfif thisTag.executionMode EQ "start">
  <cfset params = [] />
<cfelse>
  <cfset caller[attributes.name] = ormExecuteQuery(
    thisTag.generatedContent,
    params,
    structKeyExists(attributes, "unique") AND attributes.unique
  ) />
  <cfset thisTag.generatedContent = "" />
</cfif>
And then the queryparam tag:
<cfif thisTag.executionMode EQ "start">
  <cfset arrayAppend(getBaseTagData("cf_query").params, attributes.value) />
  <cfoutput>?</cfoutput>
</cfif>
Wheee! And here's how you might use them:
<cfimport prefix="h" taglib="/tags/hqlquery" />
<h:query name="policies">
  from FtoPolicy
  order by effectiveDate
</h:query>
<h:query name="emp" unique="true">
  from Employee
  where username = <h:queryparam value="#attributes.username#" />
</h:query>
Note, in particular, that I support a 'unique' attriute on query which behaves exactly like the 'unique' argument to ormExecuteQuery returning a single entity instead of an array of entities.
I happen to think tag-based approaches are very nice. This looks pretty sweet to me.