jparepository查询所有_jpa中查询大量数据

数据库查询一直是提高程序速度的瓶颈之一,本人也遇到了因为数据库数据查询过久导致影响失败,在这里记录以下解决的方法。

描述

该功能为统计功能,根据参数查找出符合的器具信息,然后再根据统计信息得出统计数据。就好比要统计某个年级学生的优秀,良好,及格率。看起来简单容易实现,但是到了测试环境中,却出现了错误:查询过久得不到响应。

排查

经过打断点查看,发现系统问题出在了查询数据的过程中。经过排查是数据过大,并且要连接的表过多,导致查询时间花费过大,前台得不到响应。

hibernate在查询时,总会自动把所有关联的数据查询出来,而关联的数据又有关联的实体,这样一样导致要连接查询的表过多。就好比学生,教师,学院这三个实体:

class Student {

......

@ManyToOne

Teacher teacher; // 所属教师

@OneToOne

Score score; // 所属成绩

}

class Teacher {

......

@ManToOne

College college; // 所属学院

}

class College {

.......

}

当统计学生成绩时,我们并不需要教师的信息,但是hibernate 在查询时会自动来连接teacher表把教师的信息也查询出来,同时查询教师时还会连接学院表,把学院的数据也查询出来。这就导致了我们需要为冗余的数据牺牲查询速度。所以解决的思路就是,在统计查询时,仅仅查询我们需要的数据,不查询我们不需要的数据。

解决

在复杂的查询中,往往需要许多关联的数据,可以通过自定义查询和投影的方式,实现在hibernate中,仅仅查询自己想要的关联数据,提高查询速度。

在上面的例子中,我们可以自定义查询:

select name, score.score from student jion score on score.id=student.id where grade=2019

仅仅查询学生中的名字,学生成绩中的成绩两个信息,之后再通过投影,投影到实体上:

public interface StudengtScoreProjections {

String name;

Double score;

}

整合自定义查询和投影到仓库类中:

public interface StudentRepository extends CrudRepository {

@Query(value = "select name, score.score as score from student jion score s on score.id=student.id where grade=?1) ",nativeQuery = true)

List getAllByGrade(Long grade);

}

为了复用查询,可以建立响应的视图,查询时从视图中查询:

// 数据库建立视图

create view student_score as

select name, score.score as score,grade from student jion score s on score.id=student.id

// 仓库类中改为从视图中查询

public interface StudentRepository extends CrudRepository {

@Query(value = "select * from student_score where grade=?1) ",nativeQuery = true)

List getAllByGrade(Long grade);

}

再建立投影和实体之间的转换方法,达到查询的目的。

总结

通过自定义查询和投影的方法,来解决hibernate自动查询关联数据的问题,使用自定义的查询,可以提高数据库查询的灵活性和速度。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/436918.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数据库开发文章汇总

数据库是否应该使用外键约束?

【转】github中origin和upstream的区别

Fork,本身并不是git工具中的一个命令,也不是对git的扩展,它是在GitHub上的概念,是另一种clone方式——在服务器端的clone。 而我们通常意义上的clone,是将远程repo 复制一份到本地。 当你从GitHub上 clone 一个 repo …

sum函数两个同行的元素相加_Excel函数公式大全:利用sum函数进行汇总以及对多个汇总进行求和...

教程领到手,学习不用愁!领 ↑↑↑最高效最快速的入门学习方式:看知识兔视频课程,跟着知识兔老师操作,听知识兔老师讲解,初学者不要自己瞎琢磨瞎折腾,很容易走弯路。学以致用,光看不练…

【开源库学习】OpenThreads

项目地址 Github:https://github.com/tibogens/OpenThreads 码云:https://gitee.com/lukeson/OpenThreads 参考资料 网上已经有很多比较好的文章了,这里汇总一下,便于查阅。 OpenThreads库介绍——ConditionOpenThreads库介绍…

cors 前后端分离跨域问题_前后端分离之CORS跨域访问踩坑总结

前言前后端分离的开发模式越来越流行,目前绝大多数的公司与项目都采取这种方式来开发,它的好处是前端可以只专注于页面实现,而后端则主要负责接口开发,前后端分工明确,彼此职责分离,不再高度耦合,但是由于这种开发模式将前后端项目分开来独立部署,所以将必不可免的会碰到跨域问…

【转】WPF入门教程系列六——布局介绍与Canvas(一)

从这篇文章开始,我们将对WPF中的界面如何布局做一个较简单的介绍,大家都知道:UI是做好一个软件很重要的因素,如果没有一个漂亮的UI,功能做的再好也无法吸引用户使用,而且没有漂亮的界面,那么普通…

【OSG学习】学习方法

1. 环境准备 运行调试环境的准备参考我的另外一篇博客:【OSG学习】准备开发调试环境 运行调试环境准备比较麻烦,但是不复杂,需要耐心。但是可能很多人会被卡在这一步,后面我会专门提供直接可以使用的完整项目,方便大…

【转】Vue.js入门教程(二)在页面中引入vue的方式

第二章:安装和基础效果展示 页面中引入vue 因为我们的目标是在最短的时间之内学会vue的使用方法,所以我们不一定需要通过npm工程化进行安装,你直接用script在页面中引用也完全没有问题。 第一种引入方式,script直接引入&#xf…

空间注意力机制sam_Attention注意力机制介绍

什么是Attention机制Attention机制通俗的讲就是把注意力集中放在重要的点上,而忽略其他不重要的因素。其中重要程度的判断取决于应用场景,拿个现实生活中的例子,比如1000个人眼中有1000个哈姆雷特。根据应用场景的不同,Attention分…

【OSG】Examples

推荐内容 关于示例项目解析的内容推荐: OSG3.4内置Examples解析【目录】 下面是个人学习笔记。 1. Examples osgbillboard 这个项目很简单,就几个函数,而且很有意思。 osg::Billboard类是一个控制器,不管你怎么旋转漫游场景&a…

【转】页(page),用户控件(userControl),窗口(window)区别

欢迎加入BIM行业开发交流1群 群号:711844216 背景 大家在vs中新建wpf项目后,会发现在添加新建项时会出现下列三个选项 它们有什么区别呢? 区别: 页:通常用于网页窗口:通常一个桌面app只有一个主窗口用户控件&#…

python可以开发驱动吗_Python机器学习实践:测试驱动的开发方法

Python机器学习实践:测试驱动的开发方法作者:(美)马修柯克(Matthew Kirk) 著出版日期:2017年10月文件大小:30.91M支持设备:¥40.00在线试读适用客户端:言商书局iPad/iPhone客户端:下载…

关于typedef的正确理解

我对typedef的理解一直都是认为它和#define一样,分成三个部分,比如: #define A B但是遇到以下这种函数类型定义 typedef void (*funcName)(int);按照上面的理解,难道是要把void定义成(*funcName)(int)?显然不对。 这…

【转】WebSocket API总结

NCU.卓越141.chenyuchao 一、检查 WebSocket 支持 var host "ws://localhost:8080/mychat"; var ws; if (WebSocket in window) { ws new WebSocket(host); } else if (MozWebSocket in window) { ws new MozWebSocket(host); } else { window.alert(&quo…

字节流转化为文件流_字节流转成字符串之后,在通过字符串转成字节流后的文件为什么会不一样?...

public static void main(String[] args) throws Exception {File sourceFile new File("/home/joy/图片/img1-lg.jpg");File tempFile new File("/home/joy/桌面/TempFile");saveTempFile(sourceFile, tempFile);String str byteToString(tempFile);Fi…

OpenGL基本运行模型

OpenGL是一种三维技术规范。 我们知道三维渲染场景需要实时计算大量数据。 这里我根据自己的经验总结出一句话: 计算机中,对性能要求高的功能模块,其运行原理必然是简单易行的! 有理由断言:OpenGL没那么难。 OpenGL工…

matlab绘制球面模型_MATLAB采用surf/surfc/surfl/surfnorm绘制球体

利用绘制球体sphere(n),展示了MATLAB中的surf,surfc,surfl,surfnorm,surface五个绘图命令。启动MATLAB,新建脚本(CtrlN),输入如下代码:close all; clear all; clcn20;[x,y,z]sphere(…

【转】浅谈TDD、BDD、ATDD、DDD的区别

四个开发模式意思: TDD:测试驱动开发(Test-Driven Development)BDD:行为驱动开发(Behavior Driven Development)ATDD:验收测试驱动开发(Acceptance Test Driven Development&#x…

【OSG】OSG运行模型

关于运行模型 OSG中的类很多,只看OSG代码,很难把各个类串联起来。 我们知道面向对象程序的运行模型是:对象对象间协作。 单纯看代码,多数情形下,只能了解程序中有哪些对象,而不知道它们是如何协作的&…

用姓名字段统计人数_基于 Wide amp; Deep 网络和 TextCNN 的敏感字段识别

数据治理 (Data Governance) [1]作为一种数据管理的重要一环,主要目的在于保证数据在整个生命周期内的高质量性。数据治理的核心包括:数据的可用性 (Availability),易用性 (Usability),一致性 (Consistency),完整性 (I…