QueryDSL с многофункциональным полем

У меня есть класс сущности с полем lob, называемым RAW (поставщик eclipselink JPA и сервер sql), также я использую querydsl для запроса к базе данных. Но у меня такая проблема...

javax.persistence.PersistenceException: Exception [EclipseLink-4002] (Eclipse Persistence Services - 2.5.0.v20130507-3faac2b): org.eclipse.persistence.exceptions.DatabaseException
Internal Exception: java.sql.SQLException: The text data type cannot be selected as DISTINCT because it is not comparable.
Error Code: 421
Call: SELECT DISTINCT ID, ALTA, ANIO, FECHARECEPCION, INSTITUCION, MES, RAW, VERSION FROM ARCHIVO WHERE (FECHARECEPCION BETWEEN ? AND ?)
    bind => [2013-01-01 00:00:00.0, 2014-01-31 23:59:59.0]
Query: ReadAllQuery(referenceClass=Archivo sql="SELECT DISTINCT ID, ALTA, ANIO, FECHARECEPCION, INSTITUCION, MES, RAW, VERSION FROM ARCHIVO WHERE (FECHARECEPCION BETWEEN ? AND ?)")

Какие-либо предложения?

Запрос

    QArchivo archivo = QArchivo.archivo;
    JPAQuery query = from(archivo); 

    query.where(archivo.institucion.eq(institucion));   
    query.where(archivo.fechaRecepcion.between(fechaInicio, fechaTermino));

    List<Archivo> resultado = query.list(archivo);

    return resultado;

person Hector    schedule 13.09.2013    source источник
comment
Как выглядит запрос Querydsl?   -  person Timo Westkämper    schedule 13.09.2013
comment
Я обновляю вопросы запросом...   -  person Hector    schedule 14.09.2013
comment
ясно, что проблема связана с полем lob и отдельным выражением...   -  person Hector    schedule 14.09.2013


Ответы (1)


Странно, что он использует DISTINCT, когда вы вызвали list(), а не listDistinct(), и, похоже, не вызывали Different(). Дважды проверьте, что вы нигде не вызываете Different(). DISTINCT обычно используется только с соединениями, поэтому, поскольку вы ничего не используете, очень странно, что он используется.

Вы также можете попробовать тот же запрос через JPQL или Criteria API, он не должен использовать DISTINCT, если только он не указан.

Если вы хотите использовать DISTINCT и иметь LOB, вы не можете выбрать LOB. Вы можете либо поместить LOB в отдельную таблицу и ссылаться на него через OneToOne, либо сделать его fetch=LAZY.

Вы также можете переформулировать запрос, чтобы использовать подвыборку, чтобы различать только в подвыборке.

i.e.

Select a from Archivo a where exists (select a2 from Archivo a2 where ... and a = a2))
person James    schedule 16.09.2013