Not commenting on the overall solution (EJBQL shortcomings are probably a topic of a seaparate thread), but Expressions can store parameters, just like queries:
Expression e = ... Expression eWithParameters = e.expWithParameters(parametersMap); Andrus On May 17, 2011, at 12:13 PM, Laurent Marchal wrote: > To be more clear what we've done in our lightweight non-persitent object > factories is to convert Cayenne Expressions into SQL and append them to the > SQLtemplate query. So we don't have control over the parameters passed since > they are Cayenne Expressions. > > I know this is awful but Cayenne was not providing any solutions for this, > and it was done when Cayenne EJBQL support was not there yet. Then later we > had bugs in the EJBQ so we kept using Cayenne Expressions everywhere in our > code but had to make this dirty SQLTemplate + Expressions mix workaround. > > Laurent. > > Le 05/17/2011 10:15 AM, Robert Zeigler a écrit : >> ... I'm still not 100% clear why this precludes using SQLTemplate >> parameters? If you're generating the SQL, you can also generate the >> parameter in the SQL... right? >> >> Robert >> >> On May 17, 2011, at 5/179:52 AM , Laurent Marchal wrote: >> >>> I can't use SQL parameters becauseI do some dirty stuff : I have factories >>> of lightweight non-persitent objects created from datarows where the SQL is >>> generated. I'm not proud of this but we didn't find any other solutions >>> with cayenne... >>> >>> Thanks >>> Laurent. >>> >>> >>> Le 05/16/2011 03:52 PM, Robert Zeigler a écrit : >>>> Why can't you use sql parameters? >>>> >>>> WHERE SDEPTHR.JOBNAME #bindEqual($val); >>>> >>>> and then when you execute the query, update the parameter map with >>>> key:"val" and value: "Test_*@#*"? >>>> >>>> Robert >>>> >>>> On May 16, 2011, at 5/163:35 PM , Laurent Marchal wrote: >>>> >>>>> Hi, >>>>> >>>>> I am using a simple SQLTemplate select query but it fails because of >>>>> special charachters : >>>>> >>>>> SELECT * FROM SDEPTHR INNER JOIN THRESH ON >>>>> SDEPTHR.DEPTHRID=THRESH.THRESHID WHERE SDEPTHR.JOBNAME = 'Test_*@\#*' >>>>> >>>>> Error returned : >>>>> [v.3.0.1 Aug 25 2010 19:58:47] Error parsing template 'SELECT * FROM >>>>> SDEPTHR INNER JOIN THRESH ON SDEPTHR.DEPTHRID=THRESH.THRESHID WHERE >>>>> SDEPTHR.JOBNAME = 'Test_*@\#*'' : Lexical error: >>>>> org.apache.velocity.runtime.parser.TokenMgrError: Lexical error at line >>>>> 1, column 115. Encountered:<EOF> after : "" >>>>> >>>>> It looks like the '#*' is the problem but I can't find a way to properly >>>>> escape those >>>>> characters<http://velocity.apache.org/engine/releases/velocity-1.5/user-guide.html#stringliterals>. >>>>> I know using the SQLTemplate parameters would solve this problem but I >>>>> can't do that. >>>>> Is there a way to tell cayenne to not parse the query with velocity or to >>>>> escape properly the query ? >>>>> >>>>> Thank you. >>>>> Laurent. >
