带有Lob字段的QueryDSL

时间:2013-09-13 15:37:12

标签: java jpa eclipselink querydsl

我有一个名为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;

1 个答案:

答案 0 :(得分:0)

当你调用list()而不是listDistinct()时,它使用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))