`
wangyanlong0107
  • 浏览: 499839 次
  • 性别: Icon_minigender_1
  • 来自: 沈阳
社区版块
存档分类
最新评论

HQL不支持UNION

 
阅读更多

javax.servlet.ServletException: unexpected token: ( near line 1, column 1 [( select emp from com.neusoft.talentbase.common.business.organization.model.assignedjob.AssignedJobPO a,com.neusoft.talentbase.common.business.staffing.common.po.EmployeePO emp  where a.oid=emp.jobID and a.leaderLevel in ('0','1') and a.unitPO.oid=1738419 and a.status='1' and emp.status='1' and emp.employeeStatus in ('2','5','11','7') ) union ( select e from com.neusoft.talentbase.common.business.organization.model.assignedjob.AssignedJobPO a,com.neusoft.talentbase.common.business.staffing.common.po.EmployeePO e,com.neusoft.talentbase.staffing.model.parttime.ParttimePO p  where    a.oid=p.jobID  and e.oid=p.employee  and a.leaderLevel in ('0','1')  and a.unitPO.oid= 1738419 and a.status='1'  and e.status='1'  and p.status='1'  and e.employeeStatus in ('2','5','11','7') )]
	org.apache.struts.action.RequestProcessor.processException(RequestProcessor.java:516)
	org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:423)
	org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:226)
	com.neusoft.talentbase.framework.core.strutsextension.TbRequestProcessor.process(TbRequestProcessor.java:80)
	org.apache.struts.action.ActionServlet.process(ActionServlet.java:1164)
	org.apache.struts.action.ActionServlet.doGet(ActionServlet.java:397)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:689)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
	com.neusoft.report.sample.security.LoginUserFilter.doFilter(LoginUserFilter.java:49)
	com.neusoft.talentbase.framework.core.usercontext.UserContextFilter.doFilter(UserContextFilter.java:82)
	com.neusoft.talentbase.framework.core.filter.CharsetEncodingFilter.doFilter(CharsetEncodingFilter.java:55)

HQL语句:

( select emp from AssignedJobPO a,EmployeePO emp  where a.oid=emp.jobID and a.leaderLevel in ('0','1') and a.unitPO.oid=1738419 and a.status='1' and emp.status='1' and emp.employeeStatus in ('2','5','11','7') )

union 

   ( select e from AssignedJobPO a,EmployeePO e,ParttimePO p  where    a.oid=p.jobID  and e.oid=p.employee  and a.leaderLevel in ('0','1')  and a.unitPO.oid= 1738419 and a.status='1'  and e.status='1'  and p.status='1'  and e.employeeStatus in ('2','5','11','7') )

 

原来HQL不支持UNION操作,因此会报错。

推荐 1,用视图,2,用两个简单的查询

 

下面是stackoverflow上面的一个人的留言:

You could use id in (select id from ...) or id in (select id from ...)

e.g. instead of non-working

from Person p where p.name="Joe"
union
from Person p join p.children c where c.name="Joe"

you could do

from Person p 
  where p.id in (select p1.id from Person p1 where p1.name="Joe") 
    or p.id in (select p2.id from Person p2 join p2.children c where c.name="Joe");

At least using MySQL, you will run into performance problems with the later though. It's sometimes easier to do a poor man's join on two queries instead:

// use set for uniqueness
Set<Person> people = new HashSet<Person>((List<Person>) query1.list());
people.addAll((List<Person>) query2.list());
return new ArrayList<Person>(people);

It's often better to do two simple queries than one complex one.

EDIT:

to give an example, here is the EXPLAIN output of the resulting MySQL query from the subselect solution:

mysql> explain 
  select p.* from PERSON p 
    where p.id in (select p1.id from PERSON p1 where p1.name = "Joe") 
      or p.id in (select p2.id from PERSON p2 
        join CHILDREN c on p2.id = c.parent where c.name="Joe") \G
*************************** 1. row ***************************
           id: 1
  select_type: PRIMARY
        table: a
         type: ALL
possible_keys: NULL
          key: NULL
      key_len: NULL
          ref: NULL
         rows: 247554
        Extra: Using where
*************************** 2. row ***************************
           id: 3
  select_type: DEPENDENT SUBQUERY
        table: NULL
         type: NULL
possible_keys: NULL
          key: NULL
      key_len: NULL
          ref: NULL
         rows: NULL
        Extra: Impossible WHERE noticed after reading const tables
*************************** 3. row ***************************
           id: 2
  select_type: DEPENDENT SUBQUERY
        table: a1
         type: unique_subquery
possible_keys: PRIMARY,name,sortname
          key: PRIMARY
      key_len: 4
          ref: func
         rows: 1
        Extra: Using where
3 rows in set (0.00 sec)

Most importantly, 1. row doesn't use any index and considers 200k+ rows. Bad! Execution of this query took 0.7s wheres both subqueries are in the milliseconds.

分享到:
评论

相关推荐

    Hibernate 课件_HQL

    - **大小写不敏感**:除了Java类名和属性名外,HQL本身对于关键字的大小写不敏感。 - **依赖于`Query`类**:每个`Query`实例代表了一个具体的查询。 #### Query接口及其主要方法 - **创建Query实例**: - `Query...

    hibernate映射配置文件不支持union联合查询[参照].pdf

    本案例中,开发者遇到了一个与Hibernate映射配置文件相关的异常,该异常涉及到不支持的“union”联合查询。具体表现为在执行查询时抛出了`SQLGrammarException`,提示为`ORA-00907: 缺失右括号`,这通常意味着SQL...

    hql语句查询

    HQL支持基本的查询操作如选择、更新、删除等,并且可以方便地进行对象之间的关联查询。 #### 二、HQL语句的基本结构 HQL语句的基本结构通常包括以下几个部分: 1. **SELECT**:指定要查询的数据。 2. **FROM**:...

    hibernate查询语言hql

    HQL支持一对一、一对多、多对一、多对多等关联查询: 1. **一对一关联**: 查询与`User`对象关联的`Profile`对象: ```java query = session.createQuery("from User u join fetch u.profile"); ``` 2. **一对...

    大数据开发+hive优化方法大全+hql优化

    【大数据开发+hive优化方法大全+hql优化】 在大数据处理领域,Hive 是一个非常重要的工具,它提供了基于 SQL 的查询语言(HQL)来处理大规模数据集。针对Hive的性能优化,可以从多个方面进行,包括SQL语句优化、...

    java分页技术汇总

    Java 8引入了Stream API,虽然不直接支持分页,但可以通过流的`limit`和`skip`操作实现分页效果,尤其适用于内存中的数据分页。 10. **数据库原生分页**: 不同的数据库系统提供了原生的分页机制,如MySQL的`...

    基于hiberate的分页小例子

    Hibernate提供了一种灵活的查询方式——Criteria API和HQL(Hibernate Query Language),它们都支持分页查询。在这些查询中,我们可以通过设置`FirstResult`和`MaxResults`参数来实现分页。`FirstResult`表示从结果...

    hive_have_null_id.tar.gz

    3. **HQL(Hive Query Language)**: HQL是Hive的查询语言,类似于SQL,支持常见的SQL操作,如SELECT、FROM、WHERE、JOIN等,但不完全兼容SQL,例如不支持事务。 4. **Hive表和分区**: Hive允许创建分桶和分区的表...

    hive 20160130

    - HQL类似于SQL,支持创建表、插入数据、选择数据、联接操作、分组聚合、子查询等。 - 特有的概念如分区、桶(Bucketing)、倾斜(Skewness)和联合(Union)。 - 使用JOIN、LEFT JOIN、RIGHT JOIN、FULL JOIN等...

    Hive使用手册Hive使用手册

    - UNION ALL用于合并多个SELECT结果集,不剔除重复行。 9. **Hive使用注意点** - 确保数据格式与表结构匹配。 - 优化查询,避免全表扫描和过度复杂的子查询。 - 合理使用分区,减少数据处理量。 10. **Hive...

    java大数据内容_6Hive、Kettle

    Hive的核心特性是其类SQL查询语言HQL(Hive Query Language),使得对大数据的查询和分析变得简单,即使对SQL不熟悉的开发者也能快速上手。此外,Hive允许开发者编写自定义的mapper和reducer来处理复杂的数据分析...

    Hibernate学习笔记

    1. HQL(Hibernate Query Language):面向对象的查询语言,类似SQL但语法更为简洁,支持类和对象的操作。 2. Criteria API:提供了一种基于Java API的动态查询方式,更易于代码的编写和维护。 3. Criteria与...

    IT名企JavaEE面试题最新整理(附答案)

    Hibernate查询方式:Hibernate的查询方式有HQL、Criteria、本地SQL和原生SQL。 Spring框架:Spring提供了控制反转(IOC)和面向切面编程(AOP),其优点包括方便的依赖注入、声明式事务管理、与多种技术整合等。 ...

    Hive实战使用指南1

    - TEXTFILE是最基础的文本格式,适合于简单的查询,但不支持压缩和优化。 - SequenceFile是二进制格式,效率较高,支持压缩。 - Parquet和ORC是列式存储格式,优化了查询性能,尤其适用于大型数据集和复杂的分析...

    hive数据类型共6页.pdf.zip

    Hive 是一个基于 Hadoop 的数据仓库工具,它允许通过 SQL-like 查询语言(HQL)来处理存储在 HDFS 上的大数据集。在 Hive 中,数据类型是定义列属性的关键部分,理解这些数据类型对于正确地存储和处理数据至关重要。...

    Hadoop就业面试宝典

    - 如果集群发生故障,通常会依赖HA(High Availability)集群配置来实现快速的主从切换,确保数据不丢失。 - 使用SecondNameNode定期备份NameNode的状态信息,以便在故障发生时快速恢复。 4. **数据倾斜问题解决**:...

    java面试常见问题之Hibernate总结

    - find()方法是简单的HQL查询,不支持参数绑定,已在Hibernate 3.x中被废弃。 - Query接口是全面的HQL查询接口,提供参数绑定、分页等多种功能。 7. Hibernate关联关系配置: - 一对一(OneToOne):两个实体间...

    我的学习笔记

    支持多种策略,如`&lt;subclass&gt;`、`&lt;joined&gt;`和`&lt;union&gt;`。 ### Hibernate懒加载 #### 一对一懒加载 当不需要立即加载关联对象时使用。 #### 一对多懒加载 同样适用于延迟加载关联对象。 ### HQL和Criteria #### ...

    Hive操作指南

    - **UNION**:自Hive 0.7.0版本起支持,允许将多种类型的数据合并到一个字段中。 #### Map数据类型详解 - **定义**:`MAP,V&gt;`,表示一个键值对集合,其中K表示键的类型,V表示值的类型。 - **使用示例**: ```...

Global site tag (gtag.js) - Google Analytics