1

我有一个带有 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;
4

1 回答 1

0

奇怪的是,当您调用 list() 而不是 listDistinct() 时它使用了 DISTINCT,并且似乎没有调用 distinct()。仔细检查您是否没有在任何地方调用 distinct() 。DISTINCT 通常仅与连接一起使用,因此由于您没有使用任何连接,因此使用它很奇怪。

您也可以通过 JPQL 或 Criteria API 尝试相同的查询,除非指定,否则不应使用 DISTINCT。

如果要使用 DISTINCT 并有 LOB,则不能选择 LOB。您可以将 LOB 放在它自己的表中并通过 OneToOne 引用它,或者使其 fetch=LAZY。

您还可以改写查询以使用子选择,以便仅在子选择中不同。

IE

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