Re: SQLTemplate not faulting an object

From: Andrus Adamchik (andru..bjectstyle.org)
Date: Fri Jun 08 2007 - 16:59:23 EDT

  • Next message: urugn urugn: "One to One relationship: Transfering ObjEntity from one DataConetx to Another"

    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: org.apache.cayenne.DataRo..549af
    >> [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
    >>
    >>
    >>
    >>
    >>
    >
    >



    This archive was generated by hypermail 2.0.0 : Fri Jun 08 2007 - 16:59:49 EDT