Just checked this in to 3.0 branch (with Modeler support):

   https://issues.apache.org/cayenne/browse/CAY-800

so you'll be able to do this for instance:

sqlTemplate.setColumnNamesCapitalization (SQLTemplate.UPPERCASE_COLUMN_NAMES)

Andrus


On Jun 5, 2007, at 2:38 PM, Andrus Adamchik wrote:

Yeah, capitalization mismatch between the default DB behavior and your mapping can bite you when you use "select *". You may have to use the "#result" directive to describe all your columns:

   http://cayenne.apache.org/doc/scripting-sqltemplate.html


Since this is a pretty common and annoying problem (and presuming that most users do follow some naming convention in mapping their case-insensitive DB), I wonder if we should add a simple fix - two methods in a SQLTemplate - "setUppercaseColumnNames", "setLowercaseColumnNames"? Anybody has thoughts on that? Or is there some JDBC way to achieve the same with "SELECT *" queries?

Andrus

On Jun 5, 2007, at 8:33 AM, Marcin Skladaniec wrote:

Hi everyone

I'm having some troubles with SQLTemplate. The one I use is fairly simple:

SQLTemplate query = new SQLTemplate(Student.class, "select * from Student WHERE isDeleted = 1");

the student entity is defined by :

        <db-entity name="Student">
                <db-attribute name="studentNumber" type="BIGINT"/>
... some other fields here ...
<db-attribute name="id" type="INTEGER" isPrimaryKey="true" isMandatory="true"/>
        </db-entity>

<obj-entity name="Student" className="ish.oncourse.server.cayenne.Student" dbEntityName="Student" superClassName="ish.oncourse.server.cayenne.glue.CayenneDataObject" > <qualifier><![CDATA[(isDeleted = null) or (isDeleted = 0)]]></ qualifier> <obj-attribute name="studentNumber" type="java.lang.Long" db- attribute-path="studentNumber"/>
... some other fields here ...
<obj-attribute name="id" type="java.lang.Integer" db-attribute- path="id"/>
        </obj-entity>

When the query is performed an exception is raised:

[java] org.apache.cayenne.CayenneRuntimeException: [v.$ {project.version} ${project.build.date} ${project.build.time}] Null value for 'id'. Snapshot: [EMAIL PROTECTED] [values={STUDENTNUMBER=5, (Other fields in here, all in upper case), ID=241}, version=-9223372036854775761, replaces=-9223372036854775808]. Prefix: null [java] at org.apache.cayenne.access.ObjectResolver.createObjectId (ObjectResolver.java:280) [java] at org.apache.cayenne.access.ObjectResolver.objectFromDataRow (ObjectResolver.java:206) [java] at org.apache.cayenne.access.ObjectResolver.objectsFromDataRows (ObjectResolver.java:120) [java] at org.apache.cayenne.access.ObjectResolver.synchronizedObjectsFromDataR ows(ObjectResolver.java:100) [java] at org.apache.cayenne.access.DataDomainQueryAction.interceptObjectConver sion(DataDomainQueryAction.java:433) [java] at org.apache.cayenne.access.DataDomainQueryAction.execute (DataDomainQueryAction.java:124) [java] at org.apache.cayenne.access.DataDomain.onQuery (DataDomain.java:722) [java] at org.apache.cayenne.intercept.DataChannelCallbackInterceptor.onQuery (DataChannelCallbackInterceptor.java:74) [java] at org.apache.cayenne.util.ObjectContextQueryAction.runQuery (ObjectContextQueryAction.java:282) [java] at org.apache.cayenne.access.DataContextQueryAction.execute (DataContextQueryAction.java:59) [java] at org.apache.cayenne.access.DataContext.onQuery (DataContext.java:1321) [java] at org.apache.cayenne.access.DataContext.performQuery (DataContext.java:1310) [java] at org.apache.cayenne.intercept.ObjectContextDecorator.performQuery (ObjectContextDecorator.java:98) [java] at ish.oncourse.server.services.DataPopulationService.runService (DataPopulationService.java:688) [java] at ish.oncourse.server.services.Service.run (Service.java:174)
     [java]     at java.lang.Thread.run(Thread.java:613)

What is wrong ? Why when all my field properties are set to lowercase (like "id") the SQLTemplate returns a DataRow with only capital letters ?


I have to use the SQLTemplate since my model defines a qualifier "<qualifier><![CDATA[(isDeleted = null) or (isDeleted = 0)]]></ qualifier>" and I actually want to fetch the records with isDeleted=1. I tried different ways to waive the constraint on the data like:

ObjEntity studentEntity = new ObjEntity ("ish.oncourse.server.cayenne.Student");
Expression exp = studentEntity.getDeclaredQualifier();
studentEntity.setDeclaredQualifier(null);
SelectQuery selectQuery = new SelectQuery(studentEntity);
studentEntity.setDeclaredQualifier(exp);

but nothing worked. Did someone achieve it ?

Thanks
Marcin
-------------------------->
ish
http://www.ish.com.au
Level 1, 30 Wilson Street Newtown 2042 Australia
phone +61 2 9550 5001   fax +61 2 9550 4001








Reply via email to