当前位置: 首页 > 知识库问答 >
问题:

Hibernate生成导致ORA-02014的Oracle查询

方博
2023-03-14

我的项目使用Hibernate版本4.0.1.Final和JPA2.0。我需要更改一个hql-add顺序,看起来很简单,只是它现在以SQL sytax错误结尾。

定义了这个HQL命名查询:

从实体%s中选择%s,其中s.status=:状态顺序按%s优先级,s.startdate

->粗体是我要补充的部分。

现在,由于这个命名查询是用lock-lockmodetype.pessimistic_write执行的,它创建用于更新的select for Oracle:

select *
  from (select entity.field 

  ...more fields...

          from DB_TABLE entity
         where (entity.STATUS = ?)
         order by entity.PRIORITY, entity.DISTRIB_START_DATE)
 where rownum <= ?
   for update

而此查询以

java.sql.SqlSyntaxerRoreXception:ORA-02014无法从具有DISTINCT,GROUP BY的视图中选择更新

没有秩序部分,它的工作很好。

有什么办法能克服这一切吗?我只需要按顺序选择那些记录。也不能在应用程序中排序,因为它只能选择表的一部分。

我尝试将Hibernate更新到4.2.21.final,但结果是一样的。Hibernate4.3+需要JPA2.1,但我不使用。
也许这是冬眠虫?

共有1个答案

莘翰采
2023-03-14

不,这不是Hibernate bug,而是在Oracle中与rownum结合进行排序的方式。更多详情请参阅本文。

基本上,这意味着您不能在Oracle中的同一查询中组合排序、rownumselect for update

您将不得不将其分解为更多的查询,确切的方法取决于您的具体需求。例如:

1)选择具有分页和排序的实体的ID:

SELECT s.id FROM Entity s WHERE s.status = :status ORDER BY s.priority, s.startDate

2)使用获得的ID选择具有锁定功能的实体:

SELECT s FROM Entity s WHERE s.id in :ids AND s.status = :status

3)如果所选实体的计数小于ID的计数,则说明同时条件发生了变化(状态发生了变化),继续处理锁定的实例或回滚并重试整个事务。

 类似资料:
  • //大家好。我的问题是我不能在clob字段中写大日期。curentli我可以写长度不大于4000的字符串。你能解释一下为什么我不能写clob到clob字段。我正在使用: Oracle数据库11g企业版11.2.0.1.0 列表项hibernate 4.2.6.final 列表项ojdbc 11.1.0.7.0 我的恩典是: 我更新entety的代码: 我尝试了几种方法来创建Clob:

  • 我想用预处理器实现虚拟视图。一个简单的例子: HQL之前: 有效HQL后: 本质上,我需要一种在执行查询之前处理查询的方法(而不是在运行中创建视图,这会产生很高的成本)。

  • 我有一个复合密钥的实体。订阅和源具有多对多的关系。 我正在使用Spring数据存储库来处理它。 当我尝试使用方法saveAll时,它会抛出 “com.mysql.jdbc.exceptions.jdbc4.mysqlsyntaxerrorexception:未知列'subscripti0_.subscription_id'” 同时尝试在保存后返回值。 Hibernate生成以下查询: 所以,现在我

  • 问题内容: 我正在使用oracle 11g,Java(struts2)和Hibernate开发应用程序。 我有一个名为mytemp的表,其列mytemp_id为NUMBER(22,0)类型。 在我的mytemp.hbm.xml文件中,ID如下所示 在我的Oracle数据库中,创建了名为“ MYTEMP_TEMP_ID_SEQ”的序列,并在Oracle中正常工作。 现在,当我尝试使用hibernat

  • 我正在运行一个带有oracle数据库的Spring后端。我使用规范API来执行查询: 这在H2和MySQL数据库中运行良好。但一旦我使用Oracle数据库,它就无法工作: im获得的控制台输出如下: 只要我删除或,它也将与oracle db一起工作。 甲骨文有没有一个解决方案,让不同的运行与分页一起? 编辑 因此,oracle似乎无法执行计数查询。为了进行比较,将使用H2生成以下sql:

  • 问题内容: 我陷入了这个问题。数据库架构是由其他人提供的,因此我不能简单地更改名称。我尝试在各处添加适当的注释,也许我遗漏了一些(显而易见的)? 这是我的完整映射(很多类),我将省略getter / setter。 问题是当hibernate试图获得全部 控制规则 ControlRuleAttrib ControleRuleAttribPK 这里的问题是,是否有可能以某种方式得到实体的?如您所见,