开发者社区 问答 正文

映射到hbm.xml文件时无法提取ResultSet

我有一个联合查询

SELECT al.C_PERSIST_ID AS id, tkl.C_PERSIST_VERSION AS version, tkl.C_TENANT_ID AS tenantId, tkl.C_MESSAGE AS message, tkl.C_CREATED AS created, tkl.C_INT_STATUS AS statusDB, tkl.C_INT_PRIORITY AS priorityDB,tkl.C_ASSIGNED_PERSON_ID AS assignedPersonId, tkl.C_SOURCE AS name, tkl.C_MAJOR_VERSION AS majorVersion, tkl.C_MINOR_VERSION AS minorVersion, tkl.C_ARCHIVED_FLAG AS archived, tkl.C_DEFINITION_ID AS definitionId,al.C_ALERT_DATETIME AS alertDateTime, al.C_ESCALATION_LEVEL AS escalationLevel, al.C_MAX_ESCALATION_LEVEL AS maxEscalationLevel, al.C_WORKFLOW_TO_START AS workflowToStart al.C_ESCALATED_FLAG AS escalatedDB,al.C_DUEDATE AS dueDate FROM tkl_Alerts al INNER JOIN tkl_TaskList_Items tkl ON al.C_PERSIST_ID = tkl.C_PERSIST_ID LEFT JOIN ( SELECT distinct du.C_TASKLISTITEM_ID FROM tkl_Distribution_Users du WHERE du.C_USER_ID = 'karishma.shaik@infor.com' AND du.C_IS_PERSON = 1) X ON tkl.C_PERSIST_ID = X.C_TASKLISTITEM_ID WHERE tkl.C_ARCHIVED_FLAG = 0 AND tkl.C_INT_STATUS <> 40 AND tkl.C_INT_STATUS <> 50 AND tkl.C_ASSIGNED_PERSON_ID IS NULL AND X.C_TASKLISTITEM_ID IS NOT NULL union

SELECT al.C_PERSIST_ID AS id, tkl.C_PERSIST_VERSION AS version, tkl.C_TENANT_ID AS tenantId, tkl.C_MESSAGE AS message, tkl.C_CREATED AS created, tkl.C_INT_STATUS AS statusDB, tkl.C_INT_PRIORITY AS priorityDB,tkl.C_ASSIGNED_PERSON_ID AS assignedPersonId, tkl.C_SOURCE AS name, tkl.C_MAJOR_VERSION AS majorVersion, tkl.C_MINOR_VERSION AS minorVersion, tkl.C_ARCHIVED_FLAG AS archived, tkl.C_DEFINITION_ID AS definitionId,al.C_ALERT_DATETIME AS alertDateTime, al.C_ESCALATION_LEVEL AS escalationLevel, al.C_MAX_ESCALATION_LEVEL AS maxEscalationLevel, al.C_WORKFLOW_TO_START AS workflowToStart, al.C_ESCALATED_FLAG AS escalatedDB,al.C_DUEDATE AS dueDate FROM tkl_Alerts al INNER JOIN tkl_TaskList_Items tkl ON al.C_PERSIST_ID = tkl.C_PERSIST_ID WHERE tkl.C_ARCHIVED_FLAG = 0 AND tkl.C_INT_STATUS <> 40 AND tkl.C_INT_STATUS <> 50 AND tkl.C_ASSIGNED_PERSON_ID = 'karishma.shaik@infor.com' ORDER BY tkl_Alerts.C_ESCALATION_LEVEL DESC, tkl_Alerts.C_PERSIST_ID DESC 当我将其映射到hbm.xml文件时,出现如下错误:

javax.persistence.PersistenceException: org.hibernate.exception.SQLGrammarException: could not extract ResultSet at org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1387) at org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1310) at org.hibernate.ejb.QueryImpl.getResultList(QueryImpl.java:277) at com.infor.ion.process.pulseengine.dao.TaskListItemHeaderDao.lambda$executeItemQuery$45(TaskListItemHeaderDao.java:661) at com.infor.ion.persist.multitenant.hibernate.Transactional.doInTransaction(Transactional.java:73) at com.infor.ion.process.pulseengine.dao.TaskListItemHeaderDao.executeItemQuery(TaskListItemHeaderDao.java:655) at com.infor.ion.process.pulseengine.dao.TaskListItemHeaderDao.getMyAlertHeaders(TaskListItemHeaderDao.java:443) at com.infor.ion.process.pulseengine.dao.TaskListItemHeaderDao.getMyAlertHeaders(TaskListItemHeaderDao.java:455) at com.infor.ion.process.pulseengine.logic.TaskListItemHeaderManager$DaoRetry$3.doInRetry(TaskListItemHeaderManager.java:276) at com.infor.ion.process.common.persist.WithRetry.doInRetry(WithRetry.java:77) at com.infor.ion.process.common.persist.WithRetry.doInRetry(WithRetry.java:113) at com.infor.ion.process.pulseengine.logic.TaskListItemHeaderManager$DaoRetry.getMyAlertHeaders(TaskListItemHeaderManager.java:272) at com.infor.ion.process.pulseengine.logic.TaskListItemHeaderManager.getMyAlertHeaders(TaskListItemHeaderManager.java:78) at com.infor.ion.process.pulseengine.logic.PulseUIServiceImpl.getMyAlertHeaders(PulseUIServiceImpl.java:149) at com.infor.ion.process.pulseengine.pulseui.api.services.PulseApiUIProxyService.getMyAlertHeaders(PulseApiUIProxyService.java:178) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498)

展开
收起
小六码奴 2019-10-03 19:33:08 930 分享 版权
阿里云 AI 助理回答
  1. 问题描述: 您遇到了一个关于联合查询(UNION)的SQL语句在映射到Hibernate的hbm.xml文件时引发的错误。具体错误为javax.persistence.PersistenceException: org.hibernate.exception.SQLGrammarException: could not extract ResultSet

  2. 查询背景

    • 查询涉及两个表:tkl_Alertstkl_TaskList_Items,以及一个子查询用于获取特定用户的任务列表项。
    • 目标是筛选出未归档、非特定状态且分配给指定用户或未分配的任务列表项,并按优先级排序。
    • 使用了UNION操作符来合并两部分查询结果,一部分针对被分配给特定用户的任务,另一部分针对未分配的任务但与该用户通过其他方式关联。
  3. 问题分析

    • 错误提示表明数据库无法从执行的SQL中提取ResultSet,这通常意味着SQL语法错误、表/列名不正确、权限问题或数据库引擎不支持的查询结构。
    • 考虑到您使用的是Hibernate框架,还需确保HQL(Hibernate Query Language)与原生SQL的兼容性,特别是对于复杂查询如UNION、子查询等。
  4. 优化建议

    • 检查表名和列名:确认所有表名和列名是否准确无误,包括大小写敏感性和数据库引擎对它们的识别。
    • HQL与原生SQL差异:考虑将原生SQL转换为等效的HQL语句,因为某些数据库特性的直接使用可能不受Hibernate完全支持。
    • 分段调试:尝试单独执行每个UNION部分的查询,以定位具体哪一部分导致的问题。
    • 索引优化:虽然不是直接解决当前错误的方法,但鉴于查询涉及多表联接和条件过滤,确保相关联接字段和条件字段上有索引可以提升整体性能。
  5. 示例优化查询(仅提供思路,实际需根据具体情况调整): 由于直接提供HQL版本的修改需要具体了解您的数据模型和Hibernate配置,这里给出一种可能的转换思路而非直接代码:

    FROM tkl_Alerts al 
    JOIN tkl_TaskList_Items tkl WITH al.C_PERSIST_ID = tkl.C_PERSIST_ID
    WHERE tkl.C_ARCHIVED_FLAG = 0 
    AND tkl.C_INT_STATUS NOT IN (40, 50)
    /* 分离条件逻辑,可能需要根据实际情况调整JOIN和WHERE子句 */
    /* 对于分配情况,考虑使用CASE WHEN或exists子句代替UNION */
    
  6. 注意事项

    • HQL与SQL差异:确保理解并应用HQL特有的表达方式,比如JOIN ON的转换、集合导航等。
    • 事务管理:在执行复杂查询时,确保事务处理得当,避免长时间锁定资源。
    • 性能监控:利用数据库和Hibernate的性能监控工具,分析查询计划,进一步调优。
  7. 参考资料

    • Hibernate官方文档中关于原生SQL查询和HQL查询的部分可能对您有帮助。

请按照上述建议逐步排查和优化,如果问题依旧,请提供更多关于数据库类型、Hibernate版本及配置细节,以便进行更深入的分析。

有帮助
无帮助
AI 助理回答生成答案可能存在不准确,仅供参考
0 条回答
写回答
取消 提交回答
问答标签:
问答地址: