You are viewing a plain text version of this content. The canonical link for it is here.
Posted to user@cayenne.apache.org by Borut Bolčina <bo...@gmail.com> on 2008/04/22 13:47:47 UTC
Re: newbie question
Hello Andrus,
what is the elegant 3.0M3 Cayenne way to do select MAX?
Thanks,
Borut
2007/10/9 Andrus Adamchik <an...@objectstyle.org>:
> Hi Jan,
>
> Looks like what you need is a SQLTemplate query:
>
> http://cayenne.apache.org/doc/sqltemplate-query.html
>
> Here is a mockup code example:
>
> SQLTemplate q = new SQLTemplate(SomeClass.class, "select MAX(id) from
> table");
> q.setFetchingDataRows(true);
>
> Map row = (Map) DataObjectUtils.objectForQuery(q);
> Number id = (Number) row.values().iterator().next();
>
> (Cayenne 3.0 will be featuring more elegant API to achieve that, but still
> the code above should work just as well)
>
> Andrus
>
Re: newbie question
Posted by Borut Bolčina <bo...@gmail.com>.
:-)
The output:
INFO [22 Apr 2008 16:21:05.055] SELECT MAX(t0.id) AS sc0 FROM event t0
INFO [22 Apr 2008 16:21:05.074] === returned 1 row. - took 19 ms.
INFO [22 Apr 2008 16:21:05.075] +++ transaction committed.
INFO [22 Apr 2008 16:21:05.082] Events max record number: 300359
Thanks, Andrus. The code is now lighter and that is always good.
2008/4/22 Andrus Adamchik <an...@objectstyle.org>:
>
> On Apr 22, 2008, at 4:33 PM, Borut Bolčina wrote:
>
> String ejbql = "SELECT max(id) FROM Event";
> >
>
> Try "SELECT max(e.id) FROM Event e"... Using entity aliases seems to be
> required by the EJBQL spec which Cayenne tries to follow.
>
> Andrus
>
>
Re: newbie question
Posted by Andrus Adamchik <an...@objectstyle.org>.
On Apr 22, 2008, at 4:33 PM, Borut Bolčina wrote:
> String ejbql = "SELECT max(id) FROM Event";
Try "SELECT max(e.id) FROM Event e"... Using entity aliases seems to
be required by the EJBQL spec which Cayenne tries to follow.
Andrus
Re: newbie question
Posted by Borut Bolčina <bo...@gmail.com>.
Thanks,
I am getting error with this:
String ejbql = "SELECT max(id) FROM Event";
Integer maxId = (Integer) DataObjectUtils.objectForQuery(context,
new EJBQLQuery(ejbql));
it says:
org.apache.cayenne.CayenneRuntimeException: [v.3.0M3 Feb 03 2008
21:10:17] Query exception.
org.apache.cayenne.CayenneRuntimeException: [v.3.0M3 Feb 03 2008 21:10:17]
Query exception.
at
org.apache.cayenne.access.DataDomainQueryAction.nextQueryException(DataDomainQueryAction.java:638)
at
org.apache.cayenne.access.DataNode.performQueries(DataNode.java:237)
at
org.apache.cayenne.access.DataDomainQueryAction.runQuery(DataDomainQueryAction.java:442)
at
org.apache.cayenne.access.DataDomainQueryAction.access$000(DataDomainQueryAction.java:67)
at
org.apache.cayenne.access.DataDomainQueryAction$2.transform(DataDomainQueryAction.java:415)
at
org.apache.cayenne.access.DataDomain.runInTransaction(DataDomain.java:847)
at
org.apache.cayenne.access.DataDomainQueryAction.runQueryInTransaction(DataDomainQueryAction.java:412)
at
org.apache.cayenne.access.DataDomainQueryAction.execute(DataDomainQueryAction.java:119)
at org.apache.cayenne.access.DataDomain.onQuery(DataDomain.java:740)
at
org.apache.cayenne.util.ObjectContextQueryAction.runQuery(ObjectContextQueryAction.java:296)
at
org.apache.cayenne.util.ObjectContextQueryAction.execute(ObjectContextQueryAction.java:84)
at
org.apache.cayenne.access.DataContext.onQuery(DataContext.java:1331)
at
org.apache.cayenne.access.DataContext.performQuery(DataContext.java:1320)
at
org.apache.cayenne.DataObjectUtils.objectForQuery(DataObjectUtils.java:275)
at
com.interseek.events.EventsIndexServer.createIndexFromEvents(EventsIndexServer.java:228)
at
com.interseek.events.EventsIndexServer.<init>(EventsIndexServer.java:118)
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native
Method)
at
sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
at
sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
at
si.noviforum.TxtIndex5.IndexDirectory.IndexDirectory$1RemoteThread.run(IndexDirectory.java:370)
Caused by: org.apache.cayenne.ejbql.EJBQLException: [v.3.0M3 Feb 03 2008
21:10:17] Invalid identification variable: id
at
org.apache.cayenne.access.jdbc.EJBQLPathTranslator.visitIdentifier(EJBQLPathTranslator.java:85)
at
org.apache.cayenne.ejbql.parser.EJBQLIdentifier.visit(EJBQLIdentifier.java:35)
at
org.apache.cayenne.ejbql.parser.SimpleNode.visitChild(SimpleNode.java:84)
at
org.apache.cayenne.ejbql.parser.SimpleNode.visit(SimpleNode.java:64)
at
org.apache.cayenne.access.jdbc.EJBQLAggregateColumnTranslator.visitAggregateColumn(EJBQLAggregateColumnTranslator.java:86)
at
org.apache.cayenne.access.jdbc.EJBQLAggregateColumnTranslator.visitMax(EJBQLAggregateColumnTranslator.java:56)
at
org.apache.cayenne.ejbql.parser.EJBQLMax.visitNode(EJBQLMax.java:35)
at
org.apache.cayenne.ejbql.parser.SimpleNode.visit(SimpleNode.java:60)
at
org.apache.cayenne.ejbql.parser.SimpleNode.visitChild(SimpleNode.java:84)
at
org.apache.cayenne.ejbql.parser.SimpleNode.visit(SimpleNode.java:64)
at
org.apache.cayenne.access.jdbc.EJBQLSelectColumnsTranslator.visitAggregate(EJBQLSelectColumnsTranslator.java:54)
at
org.apache.cayenne.ejbql.parser.EJBQLAggregate.visitNode(EJBQLAggregate.java:35)
at
org.apache.cayenne.ejbql.parser.SimpleNode.visit(SimpleNode.java:60)
at
org.apache.cayenne.ejbql.parser.SimpleNode.visitChild(SimpleNode.java:84)
at
org.apache.cayenne.ejbql.parser.SimpleNode.visit(SimpleNode.java:64)
at
org.apache.cayenne.ejbql.parser.SimpleNode.visitChild(SimpleNode.java:84)
at
org.apache.cayenne.ejbql.parser.SimpleNode.visit(SimpleNode.java:64)
at
org.apache.cayenne.access.jdbc.EJBQLSelectTranslator.visitSelectExpressions(EJBQLSelectTranslator.java:112)
at
org.apache.cayenne.ejbql.parser.EJBQLSelectExpressions.visitNode(EJBQLSelectExpressions.java:35)
at
org.apache.cayenne.ejbql.parser.SimpleNode.visit(SimpleNode.java:60)
at
org.apache.cayenne.ejbql.parser.SimpleNode.visitChild(SimpleNode.java:84)
at
org.apache.cayenne.ejbql.parser.SimpleNode.visit(SimpleNode.java:64)
at
org.apache.cayenne.ejbql.parser.SimpleNode.visitChild(SimpleNode.java:84)
at
org.apache.cayenne.ejbql.parser.SimpleNode.visit(SimpleNode.java:64)
at
org.apache.cayenne.access.jdbc.EJBQLAction$1.visitSelect(EJBQLAction.java:73)
at
org.apache.cayenne.ejbql.parser.EJBQLSelect.visitNode(EJBQLSelect.java:35)
at
org.apache.cayenne.ejbql.parser.SimpleNode.visit(SimpleNode.java:60)
at
org.apache.cayenne.access.jdbc.EJBQLAction.performAction(EJBQLAction.java:67)
at
org.apache.cayenne.access.DataNodeQueryAction.runQuery(DataNodeQueryAction.java:58)
at
org.apache.cayenne.access.DataNode.performQueries(DataNode.java:230)
... 19 more
It seems attribute id is not allowed as object entity and db entity? Here is
a partial mapping:
<db-entity name="event">
<db-attribute name="category" type="VARCHAR" isMandatory="true"
length="255"/>
<db-attribute name="id" type="INTEGER" isPrimaryKey="true"
isMandatory="true" length="11"/>
<db-attribute name="location" type="VARCHAR" length="255"/>
<db-attribute name="title" type="VARCHAR" isMandatory="true"
length="255"/>
</db-entity>
<obj-entity name="Event" className="com.mycompany.events.model.Event"
dbEntityName="event">
<obj-attribute name="category" type="java.lang.String"
db-attribute-path="category"/>
<obj-attribute name="id" type="java.lang.Integer"
db-attribute-path="id"/>
<obj-attribute name="location" type="java.lang.String"
db-attribute-path="location"/>
<obj-attribute name="title" type="java.lang.String"
db-attribute-path="title"/>
</obj-entity>
Why the restriction?
Cheers,
Borut
2008/4/22 Andrus Adamchik <an...@objectstyle.org>:
> String ejbql = "SELECT max(p.estimatedPrice) FROM Painting p";
> Number n = (Number) DataObjectUtils.objectForQuery(context, new
> EJBQLQuery(ejbql));
>
>
> Andrus
>
>
> On Apr 22, 2008, at 2:47 PM, Borut Bolčina wrote:
>
> Hello Andrus,
> >
> > what is the elegant 3.0M3 Cayenne way to do select MAX?
> >
> > Thanks,
> > Borut
> >
> > 2007/10/9 Andrus Adamchik <an...@objectstyle.org>:
> >
> > Hi Jan,
> > >
> > > Looks like what you need is a SQLTemplate query:
> > >
> > > http://cayenne.apache.org/doc/sqltemplate-query.html
> > >
> > > Here is a mockup code example:
> > >
> > > SQLTemplate q = new SQLTemplate(SomeClass.class, "select MAX(id) from
> > > table");
> > > q.setFetchingDataRows(true);
> > >
> > > Map row = (Map) DataObjectUtils.objectForQuery(q);
> > > Number id = (Number) row.values().iterator().next();
> > >
> > > (Cayenne 3.0 will be featuring more elegant API to achieve that, but
> > > still
> > > the code above should work just as well)
> > >
> > > Andrus
> > >
> > >
>
Re: newbie question
Posted by Andrus Adamchik <an...@objectstyle.org>.
String ejbql = "SELECT max(p.estimatedPrice) FROM Painting p";
Number n = (Number) DataObjectUtils.objectForQuery(context, new
EJBQLQuery(ejbql));
Andrus
On Apr 22, 2008, at 2:47 PM, Borut Bolčina wrote:
> Hello Andrus,
>
> what is the elegant 3.0M3 Cayenne way to do select MAX?
>
> Thanks,
> Borut
>
> 2007/10/9 Andrus Adamchik <an...@objectstyle.org>:
>
>> Hi Jan,
>>
>> Looks like what you need is a SQLTemplate query:
>>
>> http://cayenne.apache.org/doc/sqltemplate-query.html
>>
>> Here is a mockup code example:
>>
>> SQLTemplate q = new SQLTemplate(SomeClass.class, "select MAX(id) from
>> table");
>> q.setFetchingDataRows(true);
>>
>> Map row = (Map) DataObjectUtils.objectForQuery(q);
>> Number id = (Number) row.values().iterator().next();
>>
>> (Cayenne 3.0 will be featuring more elegant API to achieve that,
>> but still
>> the code above should work just as well)
>>
>> Andrus
>>