【发布时间】:2015-04-29 12:54:12
【问题描述】:
如何在HQL 中进行Mysql 查询:
select id , date from TABLE_1
union all
select id , date from TABLE_2
order by date asc
我知道union 的替代方法是发出两个单独的请求,但我想要union 和order by,因为它对我有很大帮助。
【问题讨论】:
如何在HQL 中进行Mysql 查询:
select id , date from TABLE_1
union all
select id , date from TABLE_2
order by date asc
我知道union 的替代方法是发出两个单独的请求,但我想要union 和order by,因为它对我有很大帮助。
【问题讨论】:
需要括号——你所拥有的是
( select id , date from TABLE_1 )
union all
( select id , date from TABLE_2
order by date asc )
你想要的是
( select id , date from TABLE_1 )
union all
( select id , date from TABLE_2 )
order by date asc
【讨论】:
MySQL 中没有括号也可以工作,但我想要HQL 中的查询。
您可以将separate 查询分成两个查询,然后将combine 将结果列表合并为一个,最后将sort 与Comparator 合并为最终列表:
Query query1 = session.createQuery("select t.id,t.dt from Table1 t");
Query query2 = session.createQuery("select t.id,t.dt from Table2 t");
List list1= query1.list();
List list2= query2.list();
list1.add(list2);
Collections.sort(list1, new Comparator<TABLE>(){
public int compare (Table t1, Table t2){
return t1.getDate().compareTo(t2.getDate());
}
});
编辑(在 cmets 之后): 在 UNION 的情况下(当查询使用 UNION 而不是 union all 并且也没有 Order By)我们可以使用 HashSet:
Query query1 = session.createQuery("select t.id,t.dt from Table1 t");
Query query2 = session.createQuery("select t.id,t.dt from Table2 t");
List list1= query1.list();
List list2= query2.list();
list1.add(list2);
HashSet uniqueResult = new HashSet(list1);
【讨论】:
list1 的排序很好,不需要将它们全部收集在HashSet 中,因为它失去了排序......你能编辑你的答案吗
unique result (UNION) 的情况下添加了它,对于 UNION ALL 它不需要使用 HashSet
UNIQUE 很重要而 Order by 不重要时,才使用 HashSet,因为 HashSet 不保证任何排序并且不确定是否对 HashSet 进行排序基于特定字段的实体。和yes 它应该在排序之前(而不是它)