[ 
https://issues.apache.org/jira/browse/CAY-1287?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12761521#action_12761521
 ] 

Evgeny Ryabitskiy commented on CAY-1287:
----------------------------------------

Ah yeah... I found way to run SQLTemplate from runtime without objectMapping! 
wow... It was not easy... really...

But I don't see why we need a DomainMap? We could pass DataNode  and it should 
be enough...
maybe we can create constructor like:
SQLTemplate(DataNode dataNode, String defaultTemplate) 
and few more things... why we need queryWithParameters...

Now to run code SQLTemplate I should write follow code:

String sql = "SELECT * FROM PersonTable WHERE Name = #bind($Name)";
Configuration config = Configuration.getSharedConfiguration();
DataDomain domain = config.getDomain();
DataMap anyDataMap = (DataMap) 
domain.getNode("MyNode").getDataMaps().iterator().next();
SQLTemplate query = new SQLTemplate(anyDataMap , sql);
Map parameters = new HashMap();
parameters.put("Name", "Eugene");
SQLTemplate newQuery = query.queryWithParameters(parameters);
List rowList = ctx.performQuery(newQuery);

It's huge and contains lot's of redundant operations... And it's hard to find 
this solution! We should add it to user guide....
We can do some Improvement to white this code:

String sql = "SELECT * FROM PersonTable WHERE Name = #bind($Name)";
Configuration config = Configuration.getSharedConfiguration();
DataDomain domain = config.getDomain();
Map parameters = new HashMap();
parameters.put("Name", "Eugene");
//here is new constructor: SQLTemplate(DataNode dataNode, String 
defaultTemplate, Map parameters)
SQLTemplate query = new SQLTemplate(domain.getNode("MyNode"), sql, parameters); 
 
List rowList = ctx.performQuery(newQuery);
        
It's more intuitive thing and doesn't requires redundant things!

Or I have alternative solution to make this code executable:

String sql = "SELECT * FROM PersonTable WHERE Name = #bind($Name)";
Configuration config = Configuration.getSharedConfiguration();
DataDomain domain = config.getDomain();
Map parameters = new HashMap();
parameters.put("Name", "Eugene");
//here is new constructor: SQLTemplate(DataNode dataNode, String 
defaultTemplate)
SQLTemplate query = new SQLTemplate(domain.getNode("MyNode"), sql, parameters); 
 
// pass parameters while performQuery to every query (not only while performing 
NamedQuery)
List rowList = ctx.performQuery(newQuery, parameters);

Also more comfortable thing... 

> SQLTemplate for not-mapping (DataRow) queries
> ---------------------------------------------
>
>                 Key: CAY-1287
>                 URL: https://issues.apache.org/jira/browse/CAY-1287
>             Project: Cayenne
>          Issue Type: New Feature
>          Components: Cayenne Core Library
>    Affects Versions: 2.0 branch
>            Reporter: Evgeny Ryabitskiy
>             Fix For: 3.0
>
>
> I wish to use nice SQLTemplate scripting engine for my simple not-mapping 
> (DataRow) runtime-formed queries.
> But now I should pass a DataObject to SQLTemplate constructor.
> The question is: "For what?"
> To do mapping???
> If my query is like: "SELECT max(id) as MAX_ID from Table1" it has no sense!
> I want to add constructor like: SQLTemplate(String defaultTemplate, Map 
> parameter)
> and teach DataContext to perform such queries well.

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.

Reply via email to