You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cayenne.apache.org by "Savva Kolbachev (JIRA)" <ji...@apache.org> on 2015/04/30 15:48:06 UTC
[jira] [Issue Comment Deleted] (CAY-2006) SQLTemplateAction doesn't
consider javaType from #result directive
[ https://issues.apache.org/jira/browse/CAY-2006?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Savva Kolbachev updated CAY-2006:
---------------------------------
Comment: was deleted
(was: I've found that I didn't use SQLTemplate and #result directive correctly.
If we want to use #result directive, we need to wrap each column in our SQL template to it. For my use-case
{code}
String sql = "SELECT #result('ID' 'int'), "
+ "#result('DATETIME' 'org.joda.time.DateTime'), "
+ "#result('DATETIME1' 'org.joda.time.DateTime') "
+ "FROM JODA, JODA1";
EntityResult jodaResult = new EntityResult(Joda.class);
jodaResult.addDbField(Joda.ID_PK_COLUMN, "ID");
jodaResult.addObjectField(Joda.DATETIME_PROPERTY, "DATETIME");
SQLResult resultDescriptor = new SQLResult();
resultDescriptor.addEntityResult(jodaResult);
resultDescriptor.addColumnResult("DATETIME1");
SQLTemplate query = new SQLTemplate(Joda.class, sql);
query.setResult(resultDescriptor);
{code}
With aliases
{code}
String sql = "SELECT #result('j.ID' 'int' 'ID'), "
+ "#result('j.DATETIME' 'org.joda.time.DateTime' 'DATETIME'), "
+ "#result('DATETIME1' 'org.joda.time.DateTime') "
+ "FROM JODA j, JODA1";
EntityResult jodaResult = new EntityResult(Joda.class);
jodaResult.addDbField(Joda.ID_PK_COLUMN, "ID");
jodaResult.addObjectField(Joda.DATETIME_PROPERTY, "DATETIME");
SQLResult resultDescriptor = new SQLResult();
resultDescriptor.addEntityResult(jodaResult);
resultDescriptor.addColumnResult("DATETIME1");
SQLTemplate query = new SQLTemplate(Joda.class, sql);
query.setResult(resultDescriptor);
{code}
In both of the examples above, I've had the same correct result
{noformat}
class org.example.cayenne.persistent.Joda
class org.joda.time.DateTime
{noformat})
> SQLTemplateAction doesn't consider javaType from #result directive
> ------------------------------------------------------------------
>
> Key: CAY-2006
> URL: https://issues.apache.org/jira/browse/CAY-2006
> Project: Cayenne
> Issue Type: Bug
> Affects Versions: 4.0.M3
> Reporter: Savva Kolbachev
> Assignee: Savva Kolbachev
> Fix For: 4.0.M3
>
>
> SQLTemplateAction doesn't consider javaType from #result directive when configurating RowDescriptorBuilder. It put to RowDescriptorBuilder.typeOverrides only types from current ObjEntity and DbEntity.
> So the following example doesn't work correctly.
> I added Joda DateTimeType provided by John Huss in [CAY-1626|https://issues.apache.org/jira/browse/CAY-1626] to the ExtendedType.
> Than I created two DbEntities with fields of TIMESTAMP type and one dependent ObjEntity.
> {code:xml|tittle=datamap}
> <db-entity name="JODA">
> <db-attribute name="DATETIME" type="TIMESTAMP"/>
> <db-attribute name="ID" type="INTEGER" isPrimaryKey="true" isMandatory="true"/>
> </db-entity>
> <db-entity name="JODA1">
> <db-attribute name="DATETIME1" type="TIMESTAMP"/>
> </db-entity>
> <obj-entity name="Joda" className="org.example.cayenne.persistent.Joda" dbEntityName="JODA">
> <obj-attribute name="datetime" type="org.joda.time.DateTime" db-attribute-path="DATETIME"/>
> </obj-entity>
> {code}
> And I got java.util.Date instead of org.joda.time.DateTime for column DATETIME1 AS D by the code below.
> {code}
> String sql = "SELECT j.ID, "
> + "#result('j.DATETIME' 'org.joda.time.DateTime' '' 'JODA.DATETIME'), "
> + "#result('DATETIME1' 'org.joda.time.DateTime' '' 'JODA1.DATETIME1') AS D "
> + "FROM JODA j, JODA1";
> EntityResult jodaResult = new EntityResult(Joda.class);
> jodaResult.addDbField(Joda.ID_PK_COLUMN, "ID");
> jodaResult.addObjectField(Joda.DATETIME_PROPERTY, "DATETIME");
> SQLResult resultDescriptor = new SQLResult();
> resultDescriptor.addEntityResult(jodaResult);
> resultDescriptor.addColumnResult("D");
> SQLTemplate query = new SQLTemplate(Joda.class, sql);
> query.setResult(resultDescriptor);
> List<Object[]> dataList = context.performQuery(query);
> for (Object[] data : dataList) {
> System.out.println(data[0].getClass());
> System.out.println(data[1].getClass());
> }
> {code}
> {noformat}
> class org.example.cayenne.persistent.Joda
> class java.util.Date
> {noformat}
--
This message was sent by Atlassian JIRA
(v6.3.4#6332)