hibernate 怎么实现嵌套子查询 ?

shijinglin 2008-03-11 12:12:50
现有下列sql:
select * from schedule_prod_log where barcode_id in
( select barcode_id from
(select barcode_id , (sum(load) - sum(down)) amt
from schedule_prod_log
group by barcode_id ) t
where t.amt>0 ) and schedule_id = 1001 ;

上述sql在 sqlplus 中都是能够执行的。

说明:

ORM对象 - > 数据库表 注释

ScheduleProdLog - > schedule_prod_log ——
barcode - > barcode_id barcode 是 ScheduleProdLog 中的对象属性
schedule - > schedule_id schedule 是 ScheduleProdLog 中的对象属性
load、down 都是ScheduleProdLog 中的属性


我写的hql是 :
String hql = " select * from ScheduleProdLog sp where sp.barcode in
( select code from
(select s.barcode.barcodeId as code, (sum(s.load) - sum(s.down)) as amt
from ScheduleProdLog s
group by s.barcode.barcodeId )
where amt > 0 )
and sp.schedule.id = " + schedule.getId()

----------------------------------------------------------------------------------------------
String sql = "select s.barcode.barcodeId as code, (sum(s.load) - sum(s.down)) as amt
from ScheduleProdLog s
group by s.barcode.barcodeId ";

Session session = getSession();
Query query = session.createQuery(sql);
List list = query.list();

前面的sql是能够执行的。
可是外面还需要嵌套……

如果执行 " select * from ( " + sql + " ) "; 就会出问题,说语法错误。

我需要通过对 amt > 0 得到 barcode 然后用得到的 barcode

改写出的hql 能在 getHibernateTemplate().find(sql); 中执行是最好。

谢谢!
...全文
673 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
tengguanbing 2011-06-19
  • 打赏
  • 举报
回复
5L的理论是可以的 但是 效率很低,数据量一大 系统基本上就废
shijinglin 2008-03-12
  • 打赏
  • 举报
回复
问题解决了,虽然不是最好的办法:

既然不能嵌套 , 那我就先把里面的值得到 在做为条件 写第二次查询,小项目不考虑性能。

String sql = "select s.barcode.barcodeId as code, (sum(s.load) - sum(s.down)) as amt
from ScheduleProdLog s group by s.barcode.barcodeId ";
Session session = getSession();
Query query = session.createQuery(sql);
List list = query.list();
List codeList = null;
if (list != null) {
codeList = new ArrayList();
for (int i = 0; i < list.size(); i++) {
Object[] row = (Object[]) list.get(i);
if (Integer.parseInt(row[1].toString()) > 0) {
Long codeid = new Long(row[0].toString());
codeList.add(codeid);
}
}
}

if(codeList==null)
return null;

DetachedCriteria crt = DetachedCriteria.forClass(ScheduleProdLog.class);
crt.setFetchMode("barcode",FetchMode.JOIN).setFetchMode("schedule", FetchMode.JOIN);
crt.createCriteria("barcode").add(Restrictions.in("barcodeId", codeList));
crt.createCriteria("schedule").add(Restrictions.eq("id",schedule.getId()));
crt.addOrder(Order.asc("barcode.barcodeId"));

return getHibernateTemplate().findByCriteria(crt);
shijinglin 2008-03-12
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 langongkun 的回复:]
select * from ( " + sql + " ) as tableA ";这样试试看。
[/Quote]

是不行的。

where 条件中不能使用聚合函数。

这只是对一个表的操作,不算复制啊。
lyz77286621 2008-03-11
  • 打赏
  • 举报
回复
好复杂的查询,关注!
yeti20011 2008-03-11
  • 打赏
  • 举报
回复
只可以在where子句中加子查询
langongkun 2008-03-11
  • 打赏
  • 举报
回复
select * from ( " + sql + " ) as tableA ";这样试试看。

67,513

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧