当前位置: 代码迷 >> J2EE >> HQL 语句查询字段的有关问题
  详细解决方案

HQL 语句查询字段的有关问题

热度:108   发布时间:2016-04-22 01:15:49.0
HQL 语句查询字段的问题
我有一个客户表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的映射过的字段自动填充,而没有映射过的字段手动填充?

------解决方案--------------------
HQL 不太好实现
你用new Customer 肯定不行 因为Customer 对象肯定没有COUNT(customer.accounts.id) 这个对应的字段
要么你重新建个VO试试
要么你用SQL 查询后自己封装PO
------解决方案--------------------
from Account ac where ac.customer.id=id

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

而Account.java的customer属性能获取到Customer的所有字段
------解决方案--------------------
Java code
统计业务员业务量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现在还差个业务员,高手来解决啊··
------解决方案--------------------
Unable to locate appropriate constructor on class[.....]
是在这个类里没有找到对应的构造函数吧?
你在这个类里加个成员变量,用来接COUNT(customer.accounts.id))的值,这个类后加的成员变量与表没有对应映射没有关系,只要这个类与表有对应关系,你后加多少成员变量都没有关系,然后把这个成员变量的赋值加到构造函数里,new Customer(customer.id,customer.name,........,COUNT(customer.accounts.id))是一定要有对应相同参数个数的构造函数的!!!
------解决方案--------------------
Customer 提供 这些参数的构造方法
------解决方案--------------------
通过sql 用 addEntity
或者

query.setResultTransformer(Transformers.aliasToBean(xx.class));
  相关解决方案