0 0

有关case when语句在hibernate中使用时的问题??5

各位达人,先听小弟的问题描述:

项目中需要完成一个报表功能,所以我先在mssql中使用了查询分析器,完成大致的sql语句,其功能已经达到了要求,代码如下
select orgname, index_year, index_month,
sum(case when type='d'then 1 else 0 end), //当类型为‘d’是加1
sum(case when type='s' then 1 else 0 end), //当类型为‘s’是加1
sum(case when type='e' then 1 else 0 end), //当类型为‘e’是加1
sum(case when type='z' then 1 else 0 end), //当类型为‘z’是加1
sum(case when type!='s' then pprice else 0 end) from
(select sr.recid, datepart(year, sr.saledate) index_year, 
datepart(month, sr.saledate) index_month, 
u.cname, u.type, e.empname, o.orgname, p.pname, p.pprice 
from t_sellrecord as sr, t_cuser as u, t_employment as e, t_organized as o, t_product as p 
where datediff(month, sr.saledate ,getdate()) < 36  
and o.recid = sr.saleorgid and sr.salesid = e.recid 
and u.recid = sr.buyerid and p.recid = sr.proid ) 
x group by orgname, index_year, index_month order by orgname asc, index_year asc, index_month asc

然后直接考到java web项目中的dao中,使用hql语句,发现不支持datepart,所以改为直接sql,就使用了createSQLQuery,来进行查询,以上代码均未更改的直接copy了,查询结果另小弟十分疑惑。。。
sql查询分析器中是
eeee 2008 7 0 0 2  0 1000.0
aaaa 2008 7 0 2 0  0 0.0
bbbb 2008 7 0 0 2  0 1000.0
cccc 2008 7 0 1 0  0 0.0
dddd 2008 6 0 2 10 0 5000.0
dddd 2008 7 0 5 4  0 2000.0
而实际结果为
eeee 2008 7 0 0 0  0 0.0
aaaa 2008 7 0 0 0  0 0.0
bbbb 2008 7 0 0 0  0 0.0
cccc 2008 7 0 0 0  0 0.0
dddd 2008 6 0 0 0  0 0.0
dddd 2008 7 0 0 0  0 0.0
似乎,第一个sum中case when获取的结果把后面的值都覆盖了,
于是我试着吧type='d'改成1=1
sql查询分析器中是
eeee 2008 7 2 0 2  0 1000.0
aaaa 2008 7 2 2 0  0 0.0
bbbb 2008 7 2 0 2  0 1000.0
cccc 2008 7 1 1 0  0 0.0
dddd 2008 6 12 2 10 0 5000.0
dddd 2008 7 9 5 4  0 2000.0
而实际结果为
eeee 2008 7 2 2 2  2 2.0
aaaa 2008 7 2 2 2  2 2.0
bbbb 2008 7 2 2 2  2 2.0
cccc 2008 7 1 1 1  1 1.0
dddd 2008 6 12 12 12  12 12.0
dddd 2008 7 9 9 9  9 9.0

各位达人哇,我疑惑不解,疑惑不解,但求赐教~~跪谢 
2008年7月10日 14:29

1个答案 按时间排序 按投票排序

0 0

采纳的答案

sum函数后面追加下别名,as XX,就可以了

2008年7月10日 15:08

相关推荐

    hibernate所用到HQL经典语句大全

    使用`CASE WHEN...THEN...ELSE...END`可以在查询中进行条件判断,生成动态结果。 综上所述,HQL提供了一系列强大的查询功能,涵盖了从简单的数据检索到复杂的条件过滤和聚合分析。掌握这些基础和进阶的知识点对于...

    hibernate_anoatation(中文版)

    在Java开发领域中,Hibernate作为一款流行的开源对象关系映射(ORM)框架,极大地简化了数据库操作。它允许开发者用面向对象的方式来处理数据库记录,从而避免了大量的SQL语句编写工作。随着Hibernate的不断更新和...

    DB2、ORACLE

    - Oracle的DECODE函数在DB2中不支持,可以使用CASE WHEN语句替代,如`SELECT CASE WHEN f_areaid IS NULL THEN '空' ELSE f_areaid END FROM masa_user`。 7. **NVL函数**: - Oracle的NVL在DB2中需要使用...

    JAVA笔试题

    - **解释**: 在Java中,如果没有显式使用`break`语句,控制流将继续执行下一个`case`或`default`块,直到遇到`break`或到达`switch`语句的末尾。因此,这段代码将首先输出“default”,然后继续执行`case 0`块并输出...

    MyBatis 常见面试题总结.zip

    使用批量插入时,可以在SQL语句中使用批处理的占位符,如`&lt;insert id="batchInsert"&gt;&lt;foreach item="item" index="index" collection="list" open="INSERT INTO table (" close=") VALUES (" separator="),"&gt;...`。...

    DB2 与ORACLE的比对.docx

    - ORACLE 的 DECODE 函数在 DB2 中不受支持,但可以使用 CASE WHEN 语句来实现相同的功能。 8. **NVL 函数**: - NVL 在 ORACLE 中用于处理 NULL 值,DB2 中对应的函数是 COALESCE,它们都能将 NULL 替换为指定的...

    36道面试常问的MyBatis面试题!.zip

    在运行时,MyBatis会根据SQL和传入参数动态生成预编译的SQL语句,然后调用数据库API执行SQL并处理结果。 3. **MyBatis与Hibernate的区别?** MyBatis更注重SQL的自由度,而Hibernate提供了一种对象关系映射(ORM)...

    mybatis学习笔记

    - `&lt;choose&gt;`, `&lt;when&gt;`, `&lt;otherwise&gt;`:类似于Java中的switch-case语句。 - `&lt;trim&gt;`:用于修剪SQL语句中的前缀、后缀或者空白字符等。 - `&lt;foreach&gt;`:用于处理多个参数或者数组集合的循环操作。 #### 八、...

    数据库学习

    3. **时间倒序显示**:在MySQL中,如果需要时间字段为null的记录排在前面,并且按照时间倒序排列,可以使用`ORDER BY CASE WHEN ... END`,例如: ``` SELECT * FROM 表名 ORDER BY CASE WHEN IFNULL(字段名, '') ...

    DB2 与ORACLE的比对.pdf

    - ORACLE 的 DECODE 函数用于条件判断和返回值,DB2 不支持,但可以使用 CASE WHEN 语句替代。 8. **NVL 函数**: - ORACLE 的 NVL 用于处理 NULL 值,DB2 不支持 NVL,但可以使用 COALESCE 函数达到相同效果。 ...

    MyBatis面试专题.pdf

    - **作用**:MyBatis支持在XML映射文件中使用标签来构建动态SQL,实现逻辑判断和SQL拼接等功能。 - **动态SQL标签**: - `trim`:去除前缀或后缀文本,常用于去除多余的AND或OR等关键字。 - `where`:自动处理...

    详细的ibatis教程

    - **choose/when/otherwise**:类似SQL中的CASE WHEN语句,根据不同的条件选择执行不同的SQL片段。 ##### 3. 事务管理 - **基于JDBC的事务管理机制**:适用于简单的应用,可以使用try-catch-finally块来控制事务的...

    Mybatis框架学习

    - **choose/when/otherwise**:类似于 switch-case 语句,选择一个子句生成。 - **foreach**:用于循环遍历集合,生成重复的 SQL 子句。 - **where**:根据条件动态生成 WHERE 子句。 - **set**:动态生成 SET 子句...

    Java面试经典题

    - 在 try 语句块内使用 return 语句时,finally 块内的代码总是会被执行,不论 try 语句块内是否抛出了异常。 - 如果 try 语句块内没有抛出异常,则 finally 块会在 return 语句之前执行。 - 如果 try 语句块内抛出...

    各种框架说明

    - **Choose-When-Otherwise**:类似于`CASE WHEN`结构,用于复杂的条件判断。 - **Foreach**:循环遍历集合或数组。 - **占位符**:`${}`和`#{}`分别表示字符串替换和预编译参数。 **关联关系** - **多对一**、**一...

    MyBatis技术文档.pdf

    - 在 SQL 语句中使用 IN 子句实现。 3. **动态设置表名**: - 通过变量或表达式动态指定表名。 4. **添加功能获取自增的主键**: - 使用 `useGeneratedKeys="true"` 和 `keyProperty` 属性。 #### 八、自定义映射 ...

    Java程序员面试题大全

    - 统计x字段不同情况的个数,以及输出条数大于200的情况:`SELECT COUNT(DISTINCT x) AS distinct_count, SUM(CASE WHEN count(x) &gt; 200 THEN 1 ELSE 0 END) AS more_than_200 FROM (SELECT x, COUNT(*) FROM A ...

    java高级软件工程师面试题

    6. **SQL统计查询**:使用CASE WHEN THEN语句结合GROUP BY和COUNT函数完成复杂的聚合统计。 7. **火车速度问题**:通过建立数学模型计算火车速度,考虑少年与火车的相对运动。 8. **Oracle语句与存储过程**:掌握DDL...

    Mybatis实例教程(一)

    2. **choose/when/otherwise**:类似于Java中的switch-case结构。 3. **foreach**:遍历集合或数组,用于批量操作。 #### 八、案例实践:订单商品案例 1. **需求**:对订单商品案例中的用户表进行增删改查操作。 ...

    java开发的岗位职责-java开发岗位职责.docx

    3. **条件判断:** 熟练使用CASE when end else语句。 4. **函数使用:** 熟悉使用Decode函数、日期函数等。 5. **视图管理:** 熟悉创建和修改视图。 6. **索引管理:** 熟练创建和修改索引。 7. **统计分析:** 熟练...

Global site tag (gtag.js) - Google Analytics