2010-09-13 17 views
6

Ho una query JPQL che funziona perfettamente con MySQL e SQL Server. Ma con Oracle non riesce conOracle CLOB e JPA/Hibernate ORDER BY?

ORA-00932: inconsistent datatypes: expected - got CLOB 

Il motivo sembra essere che Oracle non supporta ORDER BY con colonne CLOB.

C'è qualche problema con JPQL?

+0

Si sta utilizzando un distinti? –

+4

Hai davvero bisogno di un CLOB? In tal caso, potresti avere una colonna separata che prende i primi 100 caratteri del CLOB e ordina per quello. EG ORDER BY cast (substr (clob_col, 1.100) come varchar2 (100)) –

+0

CLOB è ciò che abbiamo al momento a causa della dimensione dei dati. Potremmo dover introdurre una vista con una colonna aggiuntiva per l'ordinamento e l'aggiornamento dei mapping di Hibernate. Basta capire come farlo in modo appropriato per tutti i DB supportati. –

risposta

4

Avrete bisogno di convertire il CLOB in un Varchar per fare l'ordinamento. Purtroppo le colonne Varchar sono limitate a 4000 caratteri in Oracle. Se l'ordinamento per i primi 4000 caratteri è ragionevole, ecco un esempio SQLPlus utilizzando 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.