Re: MS SQL Server: Select Distinct on text datatype

From: Andrus Adamchik (andru..bjectstyle.org)
Date: Mon Aug 04 2008 - 16:49:52 EDT

  • Next message: Chris Gamache: "Re: Cayenne 3.0M4 ignoring extended data types"

    Andrey, you are spot on with the UNSUPPORTED_DISTINCT_TYPES. Here is
    one caveat (and hopefully a workaround). "text" is a SQL Server native
    type; UNSUPPORTED_DISTINCT_TYPES stores abstract JDBC types. So I
    think Matthias can simply map his "text" column as a CLOB in Cayenne,
    and Cayenne will know to stop using DISTINCT.

    On a side note, DISTINCT is added implicitly for to-many qualifiers
    when Cayenne assumes that duplicates may be returned.

    Andrus

    On Aug 4, 2008, at 4:24 AM, Andrey Razumovsky wrote:

    > I've looked at the code a bit. Turns out there're some
    > UNSUPPORTED_DISTINCT_TYPES in SelectTranslator class. Probably if
    > "text"
    > type will be added there, this would let go the exceptions. I'll
    > advice to
    > open a JIRA issue about it.
    > By now you could try use SQLTemplate. It will not generate any
    > "distinct"
    > modifiers.
    >
    > By the way, it seems quite strange to me, that Cayenne adds
    > ''distinct'
    > modifiers automatically e.g. when selecting prefetches, even if
    > SelectQuery.isDistinct returns false (and it does by default).
    >
    > 2008/8/4, Matthias Moeser <matthia..sh.com.au>:
    >>
    >> Hi,
    >>
    >> On 04/08/2008, at 5:49 PM, Lachlan Deck wrote:
    >>
    >> On 04/08/2008, at 5:39 PM, Andrey Razumovsky wrote:
    >>>
    >>> This is definitely MS SQL's issue, not Cayenne's. Only thing I can
    >>>> recommend, if you can allow that, select all rows and then seed
    >>>> out duplicate rows manually
    >>>>
    >>>
    >>> AFAIK we are not purposely turning on the flag for obtaining
    >>> distinct
    >>> rows. (Well to be fair - we don't have the root stack trace from
    >>> ROP so
    >>> can't be certain if we are or not).
    >>>
    >>> But AFAIK Cayenne does turn certain queries into select distinct
    >>> (e.g.,
    >>> joins). Is that right?
    >>>
    >>
    >> The following, for example, is when trying to delete a record an
    >> commit the
    >> context.
    >>
    >> 17:49:47,728 [AWT-EventQueue-0] ERROR ish.view.components.Button :
    >> 165 -
    >> Failed to perform action
    >> [java] org.apache.cayenne.CayenneRuntimeException: [v.3.0-
    >> SNAPSHOT Jul
    >> 09 2008 01:28:38] Remote error. URL - http://localhost:8181/angel-server-cayenne
    >> ;
    >> CAUSE - class com.microsoft.sqlserver.jdbc.SQLServerException The
    >> text data
    >> type cannot be selected as DISTINCT because it is not comparable.
    >> [java] at
    >> org
    >> .apache
    >> .cayenne
    >> .remote
    >> .hessian.HessianConnection.doSendMessage(HessianConnection.java:151)
    >> [java] at
    >> org
    >> .apache
    >> .cayenne.remote.BaseConnection.sendMessage(BaseConnection.java:73)
    >> [java] at
    >> org.apache.cayenne.remote.ClientChannel.send(ClientChannel.java:281)
    >> [java] at
    >> org.apache.cayenne.remote.ClientChannel.onQuery(ClientChannel.java:
    >> 113)
    >> [java] at
    >> org
    >> .apache
    >> .cayenne
    >> .util
    >> .ObjectContextQueryAction.runQuery(ObjectContextQueryAction.java:317)
    >> [java] at
    >> org
    >> .apache
    >> .cayenne
    >> .util
    >> .ObjectContextQueryAction.execute(ObjectContextQueryAction.java:96)
    >> [java] at
    >> org.apache.cayenne.CayenneContext.onQuery(CayenneContext.java:340)
    >> [java] at
    >> org.apache.cayenne.CayenneContext.performQuery(CayenneContext.java:
    >> 328)
    >> [java] at
    >> ish
    >> .oncourse.cayenne.CayenneContext.performQuery(CayenneContext.java:
    >> 294)
    >> [java] at
    >> org
    >> .apache
    >> .cayenne
    >> .util.RelationshipFault.resolveFromDB(RelationshipFault.java:90)
    >> [java] at
    >> org
    >> .apache
    >> .cayenne
    >> .util
    >> .PersistentObjectList.resolvedObjectList(PersistentObjectList.java:
    >> 301)
    >> [java] at
    >> org
    >> .apache
    >> .cayenne
    >> .util.PersistentObjectList.isEmpty(PersistentObjectList.java:207)
    >> [java] at
    >> org
    >> .apache
    >> .cayenne
    >> .ObjectContextDeleteAction
    >> .relatedObjects(ObjectContextDeleteAction.java:204)
    >> [java] at
    >> org
    >> .apache
    >> .cayenne
    >> .ObjectContextDeleteAction
    >> .processRules(ObjectContextDeleteAction.java:138)
    >> [java] at
    >> org.apache.cayenne.ObjectContextDeleteAction.access
    >> $0(ObjectContextDeleteAction.java:128)
    >> [java] at
    >> org.apache.cayenne.ObjectContextDeleteAction
    >> $1.visitToMany(ObjectContextDeleteAction.java:110)
    >> [java] at
    >> org
    >> .apache
    >> .cayenne.reflect.BaseToManyProperty.visit(BaseToManyProperty.java:
    >> 102)
    >> [java] at
    >> org
    >> .apache
    >> .cayenne
    >> .reflect
    >> .PersistentDescriptor
    >> .visitDeclaredProperties(PersistentDescriptor.java:338)
    >> [java] at
    >> org
    >> .apache
    >> .cayenne
    >> .reflect
    >> .PersistentDescriptor.visitProperties(PersistentDescriptor.java:371)
    >> [java] at
    >> org
    >> .apache
    >> .cayenne
    >> .reflect
    >> .LazyClassDescriptorDecorator
    >> .visitProperties(LazyClassDescriptorDecorator.java:161)
    >> [java] at
    >> org
    >> .apache
    >> .cayenne
    >> .ObjectContextDeleteAction
    >> .processDeleteRules(ObjectContextDeleteAction.java:104)
    >> [java] at
    >> org
    >> .apache
    >> .cayenne
    >> .ObjectContextDeleteAction
    >> .deletePersistent(ObjectContextDeleteAction.java:93)
    >> [java] at
    >> org
    >> .apache
    >> .cayenne
    >> .ObjectContextDeleteAction
    >> .performDelete(ObjectContextDeleteAction.java:78)
    >> [java] at
    >> org.apache.cayenne.CayenneContext.deleteObject(CayenneContext.java:
    >> 282)
    >>
    >>
    >>



    This archive was generated by hypermail 2.0.0 : Mon Aug 04 2008 - 16:50:24 EDT