2010-09-13 31 views
6

Tengo una consulta JPQL que funciona bien con MySQL y SQL Server. Pero con Oracle falla conOracle CLOB y JPA/Hibernate ¿ORDEN POR?

ORA-00932: inconsistent datatypes: expected - got CLOB 

La razón parece ser que Oracle no admite ORDER BY con columnas CLOB.

¿Hay alguna solución JPQL para esto?

+0

¿Está utilizando un DISTINCT? –

+4

¿De verdad necesitas un CLOB? Si es así, podría tener una columna separada que tome los primeros 100 caracteres del CLOB, y ordene por eso. EG ORDER BY cast (substr (clob_col, 1,100) como varchar2 (100)) –

+0

CLOB es lo que tenemos en este momento debido al tamaño de los datos. Es posible que tengamos que presentar una vista con una columna adicional para ordenar y actualizar las asignaciones de Hibernate. Solo tenemos que descubrir cómo hacerlo de forma adecuada para todos los DB admitidos. –

Respuesta

4

Deberá convertir el CLOB en un Varchar para poder hacer el ordenamiento. Lamentablemente, las columnas Varchar están limitadas a 4000 caracteres en Oracle. Si la clasificación por los primeros 4000 caracteres es razonable, aquí hay un ejemplo usando SQLPlus DBMS_LOB.SUBSTR:

SQL> create table mytable (testid int, sometext clob); 

Table created. 

SQL> insert into mytable values (1, rpad('z',4000,'z')); 

1 row created. 

SQL> update mytable set sometext = sometext || sometext || sometext; 

1 row updated. 

SQL> select length(sometext) from mytable; 

LENGTH(SOMETEXT) 
---------------- 
      12000 

SQL> select testid from mytable 
    2 order by dbms_lob.substr(sometext, 0, 4000); 

    TESTID 
---------- 
     1 

SQL> drop table mytable; 

Table dropped. 
Cuestiones relacionadas