关于hql一些不常见但好用的技巧(个人总结)
最近一直在用spring-data-jpa这个东西,感觉方法上注解hql语句已经是很常用的方法了,
有一些关于hql的经验分享一下:
一.hql的join
hql的优势就是直接的关联关系嘛,但是通过hql语句进行join查询的时候,需要注意一些地方:
hql的join不能像类似sql的join一样,直接join两张表,需要先维护关联关系,在join:
@Entity
@Table(name = "mq_mark")
public class MarkModel implements Serializable {/*** */private static final long serialVersionUID = -5169585172209348371L;@Id@GeneratedValue(strategy = GenerationType.AUTO)public Long id;@ManyToOne(fetch = FetchType.EAGER)@JoinColumn(name = "show_id", nullable = false)@Fetch(FetchMode.JOIN)public ShowImage showImage;
}
然后在进行hql join查询
@Query("select r from MarkModel t join t.showImage r where t.type= ?1 and t.datamId = ?2 ")List<ShowImage> findMarkImages(Integer marktype, Long datamId, Pageable pageable);
会生成 left join 语句
二:hql语句的去重
使用sql去重一般是使用distinc ,但是这种方式是会影响效率的。
hql的去重推荐使用group by
@Query("select t.showImage from MarkModel t where t.type= ?1 and t.datamId = ?2 group by t.showImage.id")List<ShowImage> findMarkImages(Integer marktype, Long datamId, Pageable pageable);
看一下其生成的语句:
select showimage1_.id as id1_25_, showimage1_.create_time as create_t5_25_, showimage1_.image_url as image_ur8_25_, showimage1_.position as positio14_25_ from xxx markmodel0_ inner join mq_showpic showimage1_ on markmodel0_.show_id=showimage1_.id cross join mq_showpic showimage2_ where markmodel0_.show_id=showimage2_.id and markmodel0_.type=? and markmodel0_.datam_id=? group by markmodel0_.show_id order by showimage2_.create_time desc limit ?
这里看到有一个cross join ,看见cross join就说明要生成笛卡尔积,这样会非常大的影响效率,
经过排查,发现只有order by的时候有用到了showimage2_,所以猜测是order by的问题,看下怎么生成的order by
Pageable pageable = new PageRequest(page, rows, Direction.DESC, "showImage.createTime");//注意这里的条件 List<ShowImage> result = this.markDao.findMarkImages(marktype, datamId, pageable);
这里使用了join的表进行排序,所以才出现了cross join
将这里改成用主表的createTime进行排序
Pageable pageable = new PageRequest(page, rows, Direction.DESC, "createTime");
生成的sql立马就变了:
select showimage1_.id as id1_25_, showimage1_.create_time as create_t5_25_, showimage1_.image_url as image_ur8_25_, showimage1_.position as positio14_25_ from mq_mark markmodel0_ inner join mq_showpic showimage1_ on markmodel0_.show_id=showimage1_.id where markmodel0_.type=? and markmodel0_.datam_id=? group by showimage1_.id order by markmodel0_.create_time desc limit ?
不在有cross join了
转载于:https://www.cnblogs.com/lic309/p/4980281.html
关于hql一些不常见但好用的技巧(个人总结)相关推荐
- OpenCV常见的优化方法和技巧总结
OpenCV常见的优化方法和技巧总结 [尊重原创,转载请注明出处]http://blog.csdn.net/guyuealian/article/details/78540206 目录 OpenCV常 ...
- 中小企业如何做全网营销推广?常见的网络营销推广技巧和策略
网络营销推广就是在利用互联网推广自己的产品.在百度一搜,网络推广方法一大堆,仔细一看,真正实用的方法却少之又少,适合屌丝的方法就更加少了.其实,网络处处都能推广,关键是有一双善于发现的眼睛.下面开铭网 ...
- 数据库设计中常见表结构的设计技巧(转)
2019独角兽企业重金招聘Python工程师标准>>> 一.树型关系的数据表 不少程序员在进行数据库设计的时候都遇到过树型关系的数据,例如常见的类别表,即一个大类,下面有若干个子类, ...
- 24 个常见的 Docker 疑难杂症处理技巧
转自:Escapelife 的博客 原文:https://tinyurl.com/2p89skum 这里主要是为了记录在使用 Docker 的时候遇到的问题及其处理解决方法. 1Docker 迁移存储 ...
- 产品路线图详解:主要功能、常见类型和线路图构建技巧
产品路线图是一个高级战略文档,它描绘了产品开发的一般阶段,主要目的是将产品的愿景与公司的业务目标联系起来,它记录了产品的执行策略和总体目标. 产品路线图示例 产品路线图是战略规划的结果,它通常包括以下 ...
- php常见后门,php后门隐藏技巧大全
1. attrib +s +h 创建系统隐藏文件: attrib +s +a +r +h attrib +s +h 文件名 在 Windows 10下即使开启了显示隐藏的项目,或dir仍然看不见. 2 ...
- 【面试】—常见面试问题,面试技巧和注意事项
1.请你自我介绍一下你自己? 回答提示:往往大多数人在回答这个问题时,只说姓名.年龄.爱好.工作经验,这些在简历上都有.(面试官不瞎又不是看不到) 一家企业最希望知道的是求职者能否胜任工作,包括:最强 ...
- Python常见的30个编程技巧,下手如有神助
直接交换2个数字的位置 Python 提供了一种直观的方式在一行代码中赋值和交换(变量值).如下所示: x, y = 10, 20 print(x, y)x, y = y, x print(x, y) ...
- IOS开发常见BUG和一些小技巧(PS:耐心看完,很实用)
本文转载至 http://www.cnblogs.com/huayuan320/p/5777610.html [385][scrollView不接受点击事件,是因为事件传递失败] // // MySc ...
最新文章
- 【PC工具】图片批量添加水印工具,绿色免安装工具软件
- Ubuntu 安装 Docker 容器
- Java并发编程—ThreadLocal用法详解
- Oracle ORA-00903:表名无效
- 大数据 -- Hadoop集群环境搭建
- 死磕 java集合之TreeMap源码分析(三)- 内含红黑树分析全过程
- myisam和innodb
- Oracle Database Gateway 安装
- 兼容input 文件选择_「HTML5」FileAPI 文件操作实战
- 源码编译CWM Recovery
- 免费的asp.net 2.0空间
- 泛函分析 笔者一学期整理 感谢朱老师
- 去水印小程序好做吗?赚钱吗?
- 计算机无法加载引导,硬盘找不到无法读取MBR(硬盘的主引导记录)故障分析及解决技巧...
- 【车载】【ADC】通俗易懂ADC
- 帆软思迈特软件Smartbi两家区别在哪里?
- 游标+bulk collect into limit的不同方法查询数据
- 校园购物平台功能说明
- Java学习总结——类和对象
- 移动支付之Android HCE的基本使用