hibernate调用mysql存储过程

在最近的项目中,碰到一小段数据库数据分析的程序,需要结合多张表联合查询或涉及到子查询,项目主要采用的java ee开发,使用了hibernate框架,由于这些表没用从实体通过hibernate直接生成,也没有外键之类的东西,于是就开始写sql,写完sql再放入程序中转为hql,然后查询。

写好的sql:中文:50 英文:1075 数字:0 中文+标点:50 中文+数字:50 。字符总数:共记1175个字符 (汉字算两个字符,数字、空格、英文字母算做一个字符),放入程序中相当难看,java中不像c#可以使用@“”将一个字符串分多行书写(或许有有种方法鄙人没发现),写作一行太长,多行使用“+”连接总感觉效率低了那么一点点心里不舒服。

最主要的原因是:后期维护实在太难。

鉴于如上几点,就将一个大的sql联合查询改为视图,将子查询也做成视图,最终可以直接查询单一视图获取需要的数据,代码中也简洁,好维护,需要修改直接改视图就行了。

但是,查询的数据是要经过动态的传入参数作查询条件的,视图依然不是最好的解决方案,所以就只能用存储过程了,因为以前从来没用过mysql的存储过程,所以一开始就没选这种方法,实在不行了,还得学,不过学起来还是很快的,很快就做好了,完成后程序代码也简洁,后期好维护,效率也可以。

上面涉及到的一些知识总结如下:

1、子查询:

SELECT H.hosCode,H.hosName,K.keshiName,N.doctornum,R.receivedcount,T.keshitime

FROM(/*统计科室医生接待人数*/

SELECT Q.keshiId,COUNT(*) AS receivedcount

FROM(/*医生和科室关系*/

SELECT D.doctorId,K.keshiId

FROM erpsinglekeshi K,erpsingledoctor D

WHERE K.keshiId=D.keshiId) as Q,erpdoctorreceivedcount R

WHERE Q.doctorId=R.doctorId

GROUP BY R.doctorId) AS R,

(/*统计科室医生在线时间*/

SELECT Q.keshiId,SUM(T.onlineTime) AS keshitime

FROM(/*医生和科室关系*/

SELECT D.doctorId,K.keshiId

FROM erpsinglekeshi K,erpsingledoctor D

WHERE K.keshiId=D.keshiId) as Q,erpdoctoronlinetime T

WHERE Q.doctorId=T.doctorId

GROUP BY T.doctorId) as T,

(/*科室人数统计*/

SELECT D.keshiId,COUNT(*) AS doctornum

FROM erpsingledoctor D

GROUP BY D.keshiId) AS N,erpsinglehospital H,erpsinglekeshi K

WHERE N.keshiId=T.keshiId AND R.keshiId=N.keshiId AND H.hospitalId=K.hospitalId AND K.keshiId=N.keshiId

2、sql转hql

sql转hql其实不难,hibernate其实是可以直接调用sql的,如果一定要将sql转为hql(好处是可以直接将实体与表对应起来),只要将表名改为实体名,字段名与实体定义相同即可。

3、视图

视图其实就是一个写好的sql,可以将需要的数据(通常是从多张表组合而来)生成一张表,但这个表是虚拟的,硬盘上并不保存这张表的数据,只会保存这个生成过程,但对于用户,查询普通表和视图是一样的,使用视图可以让用户不能直接操作表,只用作查询的时候很有用,视图创建如下(其中联合查询的几张表也是视图):

/*single_doctor*/

create view single_doctor as

SELECT H.hosCode,H.hosName,K.keshiName,N.doctornum,R.receivedcount,T.keshitime

FROM keshi_received AS R,keshi_onlinetime as T,keshi_num AS N,erpsinglehospital H,erpsinglekeshi K

WHERE N.keshiId=T.keshiId AND R.keshiId=N.keshiId AND H.hospitalId=K.hospitalId AND K.keshiId=N.keshiId

4、存储过程

存储过程(Stored Procedure)是在大型数据库系统中,一组为了完成特定功能的SQL 语句集,存储在数据库中,经过第一次编译后再次调用不需要再次编译,用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它:

#使用Navicat创建的存储过程

BEGIN

#Routine body goes here...

SELECT H.hosCode,H.hosName,K.keshiName,N.doctornum,R.receivedcount,T.keshitime,T.docType

FROM(/*统计科室医生接待人数*/

SELECT Q.keshiId,COUNT(*) AS receivedcount

FROM(/*医生和科室关系*/

SELECT D.doctorId,K.keshiId

FROM erpsinglekeshi K,erpsingledoctor D

WHERE K.keshiId=D.keshiId) as Q,erpdoctorreceivedcount R

WHERE Q.doctorId=R.doctorId AND R.currentTimestartTime

GROUP BY R.doctorId) AS R,

(/*统计科室医生在线时间*/

SELECT Q.keshiId,SUM(T.onlineTime) AS keshitime,T.docType

FROM(/*医生和科室关系*/

SELECT D.doctorId,K.keshiId

FROM erpsinglekeshi K,erpsingledoctor D

WHERE K.keshiId=D.keshiId) as Q,erpdoctoronlinetime T

WHERE Q.doctorId=T.doctorId AND T.currentTimestartTime

GROUP BY T.doctorId) as T,

(/*科室人数统计*/

SELECT D.keshiId,COUNT(*) AS doctornum

FROM erpsingledoctor D

GROUP BY D.keshiId) AS N,erpsinglehospital H,erpsinglekeshi K

WHERE N.keshiId=T.keshiId AND R.keshiId=N.keshiId AND H.hospitalId=K.hospitalId AND K.keshiId=N.keshiId AND N.doctornum

END

#参数

IN `startTime` bigint,IN `endTime` bigint

5、hibernate调用存储过程

@Autowired

protected HibernateTemplate hibernateTemplateMysql;

public List getDoctorOnlineDetails(final long startTime,final long endTime) {

return hibernateTemplateMysql.execute(new HibernateCallback() {

@SuppressWarnings("deprecation")

public Object doInHibernate(Session session) throws HibernateException,SQLException {

List doctorOnlines = new ArrayList<>();

String procdure = "{Call pro_doctor_online_detail(?,?)}";

CallableStatement cs;

cs = session.connection().prepareCall(procdure);

cs.setLong(1, startTime);

cs.setLong(2, endTime);

ResultSet rs = cs.executeQuery();

//H.hosCode,H.hosName,K.keshiName,D.doctorName,T.time,R.received

while(rs.next()){

doctorOnlines.add(new DoctorOnlineDetail(rs.getString(1),rs.getString(2),rs.getString(3),rs.getString(4),rs.getLong(5),rs.getInt(6),rs.getInt(7)));

}

return doctorOnlines;

}

});

}

hibernate mysql 存储过程_hibernate调用mysql存储过程相关推荐

  1. hql调用mysql存储过程_hibernate调用mysql存储过程

    在mysql中创建两个存储过程,如下: 1.根据id查找某条数据: 1 CREATE PROCEDURE `findEmpById`(IN id INTEGER(11))2 begin3      s ...

  2. hibernate4调用mysql存储过程_hibernate调用存储过程

    一. 建表与初始化数据 在mysql的test数据库中建立一张新表:tbl_user,建表语句如下: DROP TABLE IF EXISTS `user`; CREATE TABLE `tbl_us ...

  3. jsp实现mysql存储过程_JSP调用MySQL存储过程收藏

    JSP调用MySQL存储过程收藏 1使用不带参数的存储过程 使用 JDBC 驱动程序调用不带参数的存储过程时,必须使用 call SQL 转义序列.不带参数的 call 转义序列的语法如下所示: {c ...

  4. mysql存储过程 php_PHP调用MYSQL存储过程实例

    说一下 在PHP页面中调用MYSQL存储过程的方法 以下是几个例子 仅供参考 实例一:无参的存储过程 $conn = mysql_connect('localhost','root','root') ...

  5. go mysql存储过程_Golang 调用MySQL存储过程

    Golang 调用MySQL存储过程 最近写项目发现,很多逻辑业务的实现,写到数据库的存储过程中,然后调用,真的非常方便.后端代码量大大减少,最重要的是性能高,速度快! 引用说明:项目使用数据库ORM ...

  6. C mysql带参数存储过程_C# 调用Mysql 带参数存储过程

    使用C#调用Mysql 带参数的存储过程: 1.创建带参数的存储过程:USP_Temp_Test 2.两个参数:IN 参数为 P_XML , OUT 参数为 P_ErrorOut 3.C#代码调用该存 ...

  7. pb 调用mysql过程_pb调用mysql函数或存储过程异常

    pb调用mysql函数或存储过程异常.尤其是mysql函数带传入传出参数时,pb调用时候无法正常执行,提示SQLSTATE=37000错误. 在pb程序中正常更新mysql表中字段或读取mysql表中 ...

  8. java调用存储过程 oracle_java调用oracle存储过程

    java调用oracle存储过程 java代码 Map param = new HashMap(); param.put("in_str", "1,2,3,4" ...

  9. java调用存储过程sqlserver_Java调用SqlServer存储过程怎么实现 | 学步园

    在使用Java开发时,经常会遇到调用SqlServer存储过程的问题.下面学步园小编来讲解下Java调用SqlServer存储过程怎么实现? Java调用SqlServer存储过程怎么实现 1.数据库 ...

最新文章

  1. i2c- sda挂死分析
  2. Spring小知识——profile配置
  3. JAVA——TextArea和JTextArea添加滚动条(ScrollBars)
  4. cocos2dx-lua 笔记 方向控制 v2
  5. JavaScript学习(四十七)—构造方法创建对象的不足
  6. 清空shell控制台内容_RISC-V单片机快速入门03-基于RT_Thread Nano添加控制台
  7. Linux 链接网络
  8. 高斯分布matlab程序,生成高斯分布的matlab程序
  9. php 万能密码,万能密码漏洞利用
  10. 2021vue面试题+答案
  11. 看着现在的勒布朗·詹姆斯,让人再次回想起篮球之神——伟大的迈克尔·乔丹和他的最佳搭档——斯科蒂·皮蓬
  12. (11) IFC中物理文件解析 (Industry Foundation Class)
  13. win10/ubuntu18.04 双系统开机黑屏,无法通过grub 选择系统,直接进入Ubuntu系统
  14. 基于 Vue3.0 和 Ant Design Vue ,高颜值管理后台UI框架vue-vben-admin运行
  15. 人工智能的最新进展:比失业更严重?
  16. Google秘密入口
  17. 空间直角坐标转换成大地坐标matlab代码(附精度)
  18. mongdb 下载慢,解决
  19. JQuery dad js自定义删除和拖动回调事件
  20. 计算机多媒体应用技术ppt课件ppt,多媒体计算机技术原理及应用十二课件.ppt

热门文章

  1. 列举一些RNN类模型的常见使用形式以及常见的应用
  2. 大卫·史文森+耶鲁模式+得意弟子张磊
  3. java calendar去掉时分秒_java 8:只取年月日的java.util.Date(时分秒清零)对象
  4. 贝叶斯统计的无信息先验和共轭先验
  5. Bicolor的使用
  6. 实验七:层叠样式表(二)
  7. linux fedor 安装 gcc,fedora中如何安装gccsense
  8. 图数据库Titan安装与部署
  9. JAVA基础12-继承(3)
  10. tensorflow gan网络流程图