一个多表查询的问题
表分别为contest   字段 contest-id   title   remester  score【(大于60的个数)和一共的个数】
contest-config   字段 contest-id   type     id(统计个数)这个表要根据type的不同计算出id的数目
contest-detail   字段 contest-id   sutudent-id 
要输出sutudent-id(统计总共的个数)   title  type为0的id值/type为1的id值/type为2的id值  remester  大于60的score个数/总共score的个数
这东西怎么写HQL啊
我都快疯了

解决方案 »

  1.   

    不好意思
    有三个表:1,contest 2,contest-detail 3,contest-detail  
    表一有4个字段分别为contest-id     title       remester       score
    表二有三个字段分别为contest-id    type         id
    表三有两个字段分别为contest-id    sutudent-id 
    现在要输出1、sutudent-id字段的个数也就是聚集函数count(sutudent-id),
             2、title的值,
       3、id的个数聚集函数count(id)(要求当type属性为0时,1时,2时){这么个格式id(type=1)/id(type(2)/id(type(0)},
    4、remester的值
    5、score的个数聚集函数count(score)
      

  2.   

    用hql不行的话,你也可以直接用原生态的sql去写,同样能达到你的效果
      

  3.   

    HQL查不出来,直接用createSqlQuqry查吧,支持Sql
      

  4.   


    我也想了半天了
    这么个逻辑SQL对我也是个不小的考验
    不管是SQL还HQL只要能实现就行
      

  5.   

    再加一个输出字段contest-id   
      

  6.   

    hql语句也支持聚合函数的。你这些需求都可以通过聚合函数解决。第一个用count 要求出>60的就加个where条件
    第二个则是要用到分组group by type 统计
    第三个当然也是用count
      

  7.   

    比如第2个。求出的结果形如
    type sum
    0    x
    1    y
    2    z
    这个结果用hql语句查询出来返回的是个对象数组。取数据你会吧?
      

  8.   

    第一:你可以自己去创建一个类。下面的是我以前用到的。作为参考;
    第二:可以使用视图,然后利用视图去查询。就是有一个缺点。只能查询。import java.util.List;import javax.sql.DataSource;import org.springframework.jdbc.core.JdbcTemplate;
    import org.springframework.jdbc.core.support.JdbcDaoSupport;/**
     * 作者@:chen boning
     * 
     * @说明:自定义
     */
    public class EhomeJoyDAO {
    JdbcTemplate jdbcTemplate; /**
     * 销售统计
     * 
     * @param enterpriselogname
     * @return
     */
    public List getbusinessbuy(String enterpriselogname, String date) {
    String sql = "select  t.goodsname,sum(t.sumprice) as sumprice  from ehome_vjoy t where t.enterpriselogname='"
    + enterpriselogname
    + "' and to_char(t.lasttime,'yyyy-MM-dd') like '2008-"
    + date+"-%'group by t.goodsname";
    List list = this.getJdbcTemplate().queryForList(sql); return list;
    } public JdbcTemplate getJdbcTemplate() { return jdbcTemplate;
    } public void setJdbcTemplate(JdbcTemplate jdbcTemplate) { this.jdbcTemplate = jdbcTemplate;
    } /**
     * 财务报表
     * 
     * @return
     */
    public List getbusinessreport(String enterpriselogname, String date) {
    String sql = "select  t.goodsname,sum(t.sumprice) as sumprice,t.enterprisename  from ehome_vjoy t where t.enterpriselogname='"
    + enterpriselogname
    + "' and to_char(t.lasttime,'yyyy-MM-dd') like '2008-"
    + date+"-%'group by t.goodsname,t.enterprisename";
    List list = this.getJdbcTemplate().queryForList(sql);
    return list;
    }
      

  9.   

    t.goodsname,sum(t.sumprice) as sumprice  聚合函数不能与普通的列一起操作啊!!!!
      

  10.   

    深圳JAVA J2EE QQ①群 32763598 深圳JAVA J2EE QQ②群  6086837
    欢迎深圳的JAVA程序员加入,共同探讨技术与工作、项目合作、共享信息、结交朋友   
      加入请输入验证信息:SZJP
      

  11.   

    hql 是操作对象的,如果你这三个表没有关系,不能用union
    用sql是正确的选择:
    如果contest-id 是这三个表的主键,并且都是一一对应的:表一有4个字段分别为contest-id    title      remester      score 
    表二有三个字段分别为contest-id    type        id 
    表三有两个字段分别为contest-id    sutudent-id select contest-id ,title ,sum(case或者decode函数(oracle专用)(score >= 60,1,0) )合格人数,count(score ) 总数,sum(case或者decode函数(oracle专用)(type = 0,1,0)   )类型为0的数, 
    sum(case或者decode函数(oracle专用)(type = 1,1,0)   )类型为1的数,  
    sum(case或者decode函数(oracle专用)(type = 2,1,0)   )类型为2的数from 表1,表2,表三
    where 表1.contest-id = 表2.contest-id = 表3.contest-id 
    group by     contest-id ,title 
    如果要加remester,就在select 和 group后加入。
    上面只是一个思路,case或者decode函数的用法是不正确的,只供楼主参考,供大家讨论。
      

  12.   

    这三个表是有关系的
    contest为考试安排
    contest_config为考试审核
    contest_detail为学生试卷
      

  13.   

    深圳JAVA J2EE QQ①群 32763598 深圳JAVA J2EE QQ②群  6086837 
    欢迎深圳的JAVA程序员加入,共同探讨技术与工作、项目合作、共享信息、结交朋友  
      加入请输入验证信息:SZJP
      

  14.   

    多写几条hql语句把,不要写在一个hql语句中。。
      

  15.   

    给你举个例子吧String hql="select q.qid,q.qtitle,q.qcontent,q.qscore,q.answerNum,q.qdate,q.newdate,u.username from Question q,Grade g,Subject s ,Users u 
    where q.subject.subjectid = s.subjectid and q.grade.gradeid = g.gradeid " +
    "and u.userid = q.users.userid and g.gradeid=:gid and s.subjectid=:sid";
      

  16.   

    统计业务员业务量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现在还差个业务员,高手来解决啊··