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.