Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oracle CLOB和JPA/Hibernate订购依据?_Oracle_Hibernate_Jpa_Jpql_Ora 00932 - Fatal编程技术网

Oracle CLOB和JPA/Hibernate订购依据?

Oracle CLOB和JPA/Hibernate订购依据?,oracle,hibernate,jpa,jpql,ora-00932,Oracle,Hibernate,Jpa,Jpql,Ora 00932,我有一个JPQL查询,可以很好地与MySQL和SQL Server配合使用。但对于甲骨文来说,它的失败在于 ORA-00932: inconsistent datatypes: expected - got CLOB 原因似乎是Oracle不支持ORDER BY with CLOB列 是否有JPQL解决方案?您需要将CLOB转换为Varchar才能进行排序。不幸的是,在Oracle中,Varchar列限制为4000个字符。如果按前4000个字符排序是合理的,下面是使用DBMS_LOB.SUBS

我有一个JPQL查询,可以很好地与MySQL和SQL Server配合使用。但对于甲骨文来说,它的失败在于

ORA-00932: inconsistent datatypes: expected - got CLOB
原因似乎是Oracle不支持ORDER BY with CLOB列


是否有JPQL解决方案?

您需要将CLOB转换为Varchar才能进行排序。不幸的是,在Oracle中,Varchar列限制为4000个字符。如果按前4000个字符排序是合理的,下面是使用DBMS_LOB.SUBSTR的SQLPlus示例:

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.

你真的需要CLOB吗?如果是这样的话,您可以有一个单独的列,其中包含CLOB的前100个字符,并按此顺序排列。例如,由于数据量的原因,按类型排序(substr(clob_col,1100)作为varchar2(100))clob是我们目前拥有的。我们可能需要引入一个带有额外列的视图来对Hibernate映射进行排序和更新。只需找出如何为所有受支持的DBs很好地执行此操作。我使用distinct(),因为我在另一个查询中发现Hibernate在使用像我这样的简单查询时存在“group by”错误。但是,如果您有一个带有CLOB列的类型,distinct将无法工作,因为Oracle存在问题。Distinct使用联合来获得结果,联合显然不适用于具有CLOB的类型。我将使用ApacheCommons的SetUniqueList来缩减Java中的列表。(我的结果集相对较小)dbms_lob.substr(?,?)sintax:-第二个参数是AMOUNT,第三个参数是从1开始的偏移量