Skip to main content

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [List Home]
Re: [eclipselink-users] IndirectMap.containsKey leads to Exception because DISTINCT on @Lob-Field

You will need to find where you have enabled batch reading in your code and
remove it.  Batch reading is never enabled by default, so you are enabling
it in your code somewhere.  Look for the Query hint "eclipselink.batch", or
some custom code setting batch reading on.

If you want to try avoiding the issue by making the Lob lazy, you can add
@Basic(fetch=LAZY) to your Lob.


Hans Harz-2 wrote:
> 
> Hi James, Hi Reinhard,
> 
> thank you very much for your answers. 
> 
> I'm not sure about your suggested workaround. How can I set the
> dontUseDistinct() property on the query, when I don't specify the query
> manually.
> Is there a annotation based possibility on the Many-to-Many property? 
> 
> Right now the field in the owning class looks like this:
>     @ManyToMany(cascade = {CascadeType.PERSIST, CascadeType.REMOVE})
>     @MapKey(name = "typeId")
>     @XStreamAlias("customFields")
>     private Map<CustomFieldType, CustomFieldValue> customFields;
> 
> and the CustomFieldValue class contains the Clob Field
>    @Lob
>     @Column(nullable = true)
>     @XStreamAlias("stringValue")
>     private String stringValue;
> 
> I searched the API and documentation but can't find anything.
> 
> Because the exception appeared at one of our customers a hint to a
> workaround through editing the persistence.xml and the orm.xml would be
> great.
> 
> Thanks in advance,
> Hans
> 
> 
> 
>> -----Ursprüngliche Nachricht-----
>> Von: "James Sutherland" <jamesssss@xxxxxxxxx>
>> Gesendet: 17.11.09 19:42:42
>> An: eclipselink-users@xxxxxxxxxxx
>> Betreff: Re: [eclipselink-users] IndirectMap.containsKey leads to
>> Exception because DISTINCT on @Lob-Field
> 
> 
>> 
>> The distinct is used because you are using batch reading on the query. 
>> If
>> you do not set batch reading on the query then you will not have the
>> issue. 
>> Batch reading uses a distinct to avoid fetching duplicate data.  You can
>> disable the usage of the distinct by setting dontUseDistinct() on the
>> original batch query.  But then you will be selecting duplicate
>> potentially.
>> 
>> You could also try moving the Lob to another table, or use a fetch group
>> (LAZY) on the Lob to avoid selecting it by default.
>> 
>> We could probably try to auto-detect a Lob field in the descriptor and
>> not
>> add the distinct, so you could log a bug for that.
>> 
>> 
>> Hans Harz-2 wrote:
>> > 
>> > Hi all,
>> > 
>> > I encountered a problem in our application. Maybe some of you can help
>> me.
>> > 
>> > Using 
>> > - EclipseLink 1.1.3
>> > - Given a class A with a @Lob Field String stringValue;
>> > - Given class B with 
>> >     @ManyToMany(cascade = {CascadeType.PERSIST, CascadeType.REMOVE})
>> >     @MapKey(name = "field")
>> >     private Map<AType, A> As;
>> > 
>> > When I call As.containsKey(someAType) on the lazy loaded map 
>> > Then a Query with a DISTINCT is created.
>> > SELECT DISTINCT ...,t0.stringValue,...
>> > this leads to the following exception on oracle databases (and we made
>> a
>> > test with DB2 and it also fails)
>> > ORA-00932: inconsistent datatypes: expected - got CLOB
>> > 
>> > This is because DISTINCT queries are not allowed on BLOB or CLOB
>> fields. 
>> > Is this expected behavior?
>> > Did we miss a restriction of eclipselink? 
>> > Is there a way to not generate the query without DISTINCT?
>> > 
>> > In toplink we never had this problem, so it seems that toplink did not
>> > generate the DISTINCT.
>> > 
>> > Here is the Stack Trace.
>> > 
>> > regards,
>> > Hans
>> > 
>> > org.eclipse.persistence.exceptions.DatabaseException: Internal
>> Exception:
>> > java.sql.SQLException: ORA-00932: inconsistent datatypes: expected -
>> got
>> > CLOB Error Code: 932 Call: SELECT DISTINCT t1.ID, t1.EXPLICITVERSION,
>> > t1.STRINGVALUE, t1.UUID, .....
>> >
>> org.eclipse.persistence.exceptions.DatabaseException.sqlException(DatabaseException.java:332) 
>> >
>> org.eclipse.persistence.internal.databaseaccess.DatabaseAccessor.basicExecuteCall(DatabaseAccessor.java:667) 
>> >
>> org.eclipse.persistence.internal.databaseaccess.DatabaseAccessor.executeCall(DatabaseAccessor.java:512) 
>> >
>> org.eclipse.persistence.sessions.server.ServerSession.executeCall(ServerSession.java:536) 
>> >
>> org.eclipse.persistence.internal.queries.DatasourceCallQueryMechanism.executeCall(DatasourceCallQueryMechanism.java:205) 
>> >
>> org.eclipse.persistence.internal.queries.DatasourceCallQueryMechanism.executeCall(DatasourceCallQueryMechanism.java:191) 
>> >
>> org.eclipse.persistence.internal.queries.DatasourceCallQueryMechanism.executeSelectCall(DatasourceCallQueryMechanism.java:262) 
>> >
>> org.eclipse.persistence.internal.queries.DatasourceCallQueryMechanism.selectAllRows(DatasourceCallQueryMechanism.java:599) 
>> >
>> org.eclipse.persistence.internal.queries.ExpressionQueryMechanism.selectAllRowsFromTable(ExpressionQueryMechanism.java:2518) 
>> >
>> org.eclipse.persistence.internal.queries.ExpressionQueryMechanism.selectAllRows(ExpressionQueryMechanism.java:2476) 
>> >
>> org.eclipse.persistence.queries.ReadAllQuery.executeObjectLevelReadQuery(ReadAllQuery.java:481) 
>> >
>> org.eclipse.persistence.queries.ObjectLevelReadQuery.executeDatabaseQuery(ObjectLevelReadQuery.java:928) 
>> >
>> org.eclipse.persistence.queries.DatabaseQuery.execute(DatabaseQuery.java:664) 
>> >
>> org.eclipse.persistence.queries.ObjectLevelReadQuery.execute(ObjectLevelReadQuery.java:889) 
>> >
>> org.eclipse.persistence.queries.ReadAllQuery.execute(ReadAllQuery.java:458) 
>> >
>> org.eclipse.persistence.internal.sessions.AbstractSession.internalExecuteQuery(AbstractSession.java:2244) 
>> >
>> org.eclipse.persistence.internal.sessions.AbstractSession.executeQuery(AbstractSession.java:1181) 
>> >
>> org.eclipse.persistence.internal.sessions.AbstractSession.executeQuery(AbstractSession.java:1165) 
>> >
>> org.eclipse.persistence.mappings.ManyToManyMapping.extractResultFromBatchQuery(ManyToManyMapping.java:231) 
>> >
>> org.eclipse.persistence.internal.indirection.BatchValueHolder.instantiate(BatchValueHolder.java:58) 
>> >
>> org.eclipse.persistence.internal.indirection.QueryBasedValueHolder.instantiate(QueryBasedValueHolder.java:71) 
>> >
>> org.eclipse.persistence.internal.indirection.DatabaseValueHolder.getValue(DatabaseValueHolder.java:83) 
>> >
>> org.eclipse.persistence.internal.indirection.UnitOfWorkValueHolder.instantiateImpl(UnitOfWorkValueHolder.java:161) 
>> >
>> org.eclipse.persistence.internal.indirection.UnitOfWorkValueHolder.instantiate(UnitOfWorkValueHolder.java:230) 
>> >
>> org.eclipse.persistence.internal.indirection.DatabaseValueHolder.getValue(DatabaseValueHolder.java:83) 
>> >
>> org.eclipse.persistence.indirection.IndirectMap.buildDelegate(IndirectMap.java:110) 
>> >
>> org.eclipse.persistence.indirection.IndirectMap.getDelegate(IndirectMap.java:316) 
>> >
>> org.eclipse.persistence.indirection.IndirectMap.containsKey(IndirectMap.java:165) 
>> > 
>> > _____________________________________________________________
>> > DSL-Preisknaller: DSL-Komplettpakete von WEB.DE schon für 
>> > 16,99 Euro/mtl.!* Hier klicken: http://produkte.web.de/go/02/
>> > 
>> > 
> 
> 


-----
http://wiki.eclipse.org/User:James.sutherland.oracle.com James Sutherland 
http://www.eclipse.org/eclipselink/
 EclipseLink ,  http://www.oracle.com/technology/products/ias/toplink/
TopLink 
Wiki:  http://wiki.eclipse.org/EclipseLink EclipseLink , 
http://wiki.oracle.com/page/TopLink TopLink 
Forums:  http://forums.oracle.com/forums/forum.jspa?forumID=48 TopLink , 
http://www.nabble.com/EclipseLink-f26430.html EclipseLink 
Book:  http://en.wikibooks.org/wiki/Java_Persistence Java Persistence 
-- 
View this message in context: http://old.nabble.com/IndirectMap.containsKey-leads-to-Exception-because-DISTINCT-on-%40Lob-Field-tp26390360p26498225.html
Sent from the EclipseLink - Users mailing list archive at Nabble.com.



Back to the top