1

私は RAW (eclipselink JPA プロバイダーと SQL サーバー) と呼ばれる lob フィールドを持つエンティティ クラスを持っています。また、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;
4

1 に答える 1

0

listDistinct() ではなく list() を呼び出したときに DISTINCT を使用していて、distinct() を呼び出していないように見えるのは奇妙です。どこでもdistinct()を呼び出していないことを再確認してください。DISTINCT は通常、結合でのみ使用されるため、何も使用していないため、使用されるのは非常に奇妙です。

JPQL または Criteria API を介して同じクエリを試すこともできます。指定しない限り、DISTINCT を使用しないでください。

DISTINCT を使用して LOB を使用する場合は、LOB を選択できません。LOB を独自のテーブルに配置して OneToOne を介して参照するか、fetch=LAZY にすることができます。

副選択のみを区別するように、副選択を使用するようにクエリを言い換えることもできます。

すなわち

Select a from Archivo a where exists (select a2 from Archivo a2 where ... and a = a2))
于 2013-09-16T15:04:39.570 に答える