HQL 语句查询字段的问题

DearFen 2010-11-10 04:06:46
我有一个客户表Customer 一个帐户表Account
Customer和Account是一对多的关系
我想使用一条HQL语句查询出Customer的所有字段以及Customer下的Account的数量
我写了一个HQL语句
"SELECT new Customer(customer.id,customer.name,........,COUNT(customer.accounts.id)) FROM Customer customer"
报错了,Unable to locate appropriate constructor on class[.....]
我试过,对应的SQL语句是可以实现的
"SELECT CUSTOMER.ID,CUSTOMER.NAME.......,COUNT(ACCOUNT.ID) FROM CUSTOMER INNER JOIN ACCOUNT ON CUSTOMER.ID=ACCOUNT.CUSTOMER_ID GROUP BY CUSTOMER.ID,CUSTOMER.NAME........."
我想知道我上面的HQL语句该怎么写
请高手解答

还有一个问题,能够简化上面的HQL语句么?能不能在HQL语句里让Customer的映射过的字段自动填充,而没有映射过的字段手动填充?
...全文
636 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
sxpgaq 2012-06-15
  • 打赏
  • 举报
回复
哥们你这是原生的sql,hql 是用对象查询
微甜灬呼吸 2010-11-11
  • 打赏
  • 举报
回复
很不喜欢hql
zidasine 2010-11-10
  • 打赏
  • 举报
回复
通过sql 用 addEntity
或者

query.setResultTransformer(Transformers.aliasToBean(xx.class));
zidasine 2010-11-10
  • 打赏
  • 举报
回复
Customer 提供 这些参数的构造方法
DearFen 2010-11-10
  • 打赏
  • 举报
回复
问题解决
最终发现HQL要这样写
"SELECT new Customer(customer.id,customer.name,........,CAST(SIZE(customer.accounts) AS int)) FROM Customer customer GROUP BY customer.id,customer.name......."

这其中,size是Hibernate里的函数,GROUP BY 不能写成 GROUP BY customer,只能写成 GROUP BY cusromer.id,customer.name.....
哈哈,终于完成了两个难题,以前还以为HQL(查询的字段)中不能使用括号嵌套,现在发现原来可以嵌套

经验,大家分享一下,这样以后就可以通过查主表直接得到它对应的子记录数量了
DearFen 2010-11-10
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 jxsryecheng 的回复:]

from Account ac where ac.customer.id=id

得到List<Account>的对象list,list大小就是account的数量

而Account.java的customer属性能获取到Customer的所有字段
[/Quote]

我是要在列表页面通过是Customer 下是否有 Account 来判断是否显示编辑按钮,
如果我查一百条Customer,而每个Customer 下都有一百条Account 那项目也得卡死了
DearFen 2010-11-10
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 sosfnima 的回复:]

既然映射了 还要那么复杂吗?
1.在Customer.hbm.xml中 配置 set 的 lazy="false"
2.根据Customer的ID或者其它 查询Customer
3.想要什么 拿什么
4.把分给我!
[/Quote]

用lazy="false"那项目还不卡死
ltandfyy 2010-11-10
  • 打赏
  • 举报
回复
Unable to locate appropriate constructor on class[.....]
是在这个类里没有找到对应的构造函数吧?
你在这个类里加个成员变量,用来接COUNT(customer.accounts.id))的值,这个类后加的成员变量与表没有对应映射没有关系,只要这个类与表有对应关系,你后加多少成员变量都没有关系,然后把这个成员变量的赋值加到构造函数里,new Customer(customer.id,customer.name,........,COUNT(customer.accounts.id))是一定要有对应相同参数个数的构造函数的!!!
haozi187 2010-11-10
  • 打赏
  • 举报
回复

//暂时先用HQL嵌套解决
public void wayBillStatics() {
Session session = HibernateSessionFactoryUtil.getSessionFactory()
.getCurrentSession();
Transaction tx = session.beginTransaction();

StringBuffer ehql=new StringBuffer();
ehql.append("select distinct empl from WayBill");
Query query=session.createQuery(ehql.toString());
List<Empl> emplList=query.list();
for(Empl empl:emplList){
StringBuffer hql=new StringBuffer();
hql.append(" select new Map( ");
hql.append(" count(*) as totalNumber ");
hql.append(" ,sum(productQty) as totalProductQty ");
hql.append(" ,sum(productWeight) as totalProductWeight ");
hql.append(" ,sum(productVolume) as totalProductVolume ");
hql.append(" ,sum(productValue) as totalProductValue ");
hql.append(" ,sum(incomeCarry) as totalIncomCarry ");
hql.append(" ) ");
hql.append(" from WayBill ");
hql.append(" where valid='1' ");
hql.append(" and empl=? ");
System.out.println(hql.toString());
query=session.createQuery(hql.toString());
query.setEntity(0, empl);
List<Map> list=query.list();
for(int i=0;i<list.size();i++){
Map m=list.get(i);
System.out.println(empl.getEmpName()
+"--票数:"+m.get("totalNumber")
+"--总件数:"+m.get("totalProductQty")
+"--总重量:"+m.get("totalProductWeight")
+"--总体积:"+m.get("totalProductVolume")
+"--总价值:"+m.get("totalProductValue")
+"--总收入:"+m.get("totalIncomCarry")
);
}
}
tx.commit();
}

//运行结果:

张三--票数:2--总件数:20--总重量:200--总体积:2000--总价值:1000--总收入:800
李四--票数:1--总件数:10--总重量:100--总体积:1000--总价值:500--总收入:400


haozi187 2010-11-10
  • 打赏
  • 举报
回复


统计业务员业务量SQL:

select ManualManID,count(ManualManID) as totalNumber,sum(ProductQty) as totalProductQty,sum(ProductWeight) as totalProductWeight,sum(ProductVolume) as totalProductVolume,

sum(ProductValue) as totalProductValue,sum(IncomeCarry) as totalIncomCarry from Oms_WayBill where Valid='True'

group by ManualManID

//------------------------------------


我也要解决这问题,要用hql``

StringBuffer hql=new StringBuffer();
hql.append(" select new Map( ");
hql.append(" count(*) as totalNumber ");
hql.append(" ,sum(productQty) as totalProductQty ");
hql.append(" ,sum(productWeight) as totalProductWeight ");
hql.append(" ,sum(productVolume) as totalProductVolume ");
hql.append(" ,sum(productValue) as totalProductValue ");
hql.append(" ,sum(incomeCarry) as totalIncomCarry ");
hql.append(" ) ");
hql.append(" from WayBill ");
hql.append(" where valid='1' ");
hql.append(" group by empl.empId ");
hql.append(" order by empl.empId ");
System.out.println(hql.toString());
Query query=session.createQuery(hql.toString());
List<Map> list=query.list();
for(int i=0;i<list.size();i++){
Map m=list.get(i);
System.out.println("--票数:"+m.get("totalNumber")
+"--总件数:"+m.get("totalProductQty")
+"--总重量:"+m.get("totalProductWeight")
+"--总体积:"+m.get("totalProductVolume")
+"--总价值:"+m.get("totalProductValue")
+"--总收入:"+m.get("totalIncomCarry")
);
}

//运行结果:
--票数:2--总件数:20--总重量:200--总体积:2000--总价值:1000--总收入:800
--票数:1--总件数:10--总重量:100--总体积:1000--总价值:500--总收入:400

现在还差个业务员,高手来解决啊··


十橙心橙意 2010-11-10
  • 打赏
  • 举报
回复
from Account ac where ac.customer.id=id

得到List<Account>的对象list,list大小就是account的数量

而Account.java的customer属性能获取到Customer的所有字段
zn85600301 2010-11-10
  • 打赏
  • 举报
回复
HQL 不太好实现
你用new Customer 肯定不行 因为Customer 对象肯定没有COUNT(customer.accounts.id) 这个对应的字段
要么你重新建个VO试试
要么你用SQL 查询后自己封装PO
sosfnima 2010-11-10
  • 打赏
  • 举报
回复
既然映射了 还要那么复杂吗?
1.在Customer.hbm.xml中 配置 set 的 lazy="false"
2.根据Customer的ID或者其它 查询Customer
3.想要什么 拿什么
4.把分给我!

67,516

社区成员

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

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