最近一直在用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一些不常见但好用的技巧(个人总结)相关推荐

  1. OpenCV常见的优化方法和技巧总结

    OpenCV常见的优化方法和技巧总结 [尊重原创,转载请注明出处]http://blog.csdn.net/guyuealian/article/details/78540206 目录 OpenCV常 ...

  2. 中小企业如何做全网营销推广?常见的网络营销推广技巧和策略

    网络营销推广就是在利用互联网推广自己的产品.在百度一搜,网络推广方法一大堆,仔细一看,真正实用的方法却少之又少,适合屌丝的方法就更加少了.其实,网络处处都能推广,关键是有一双善于发现的眼睛.下面开铭网 ...

  3. 数据库设计中常见表结构的设计技巧(转)

    2019独角兽企业重金招聘Python工程师标准>>> 一.树型关系的数据表 不少程序员在进行数据库设计的时候都遇到过树型关系的数据,例如常见的类别表,即一个大类,下面有若干个子类, ...

  4. 24 个常见的 Docker 疑难杂症处理技巧

    转自:Escapelife 的博客 原文:https://tinyurl.com/2p89skum 这里主要是为了记录在使用 Docker 的时候遇到的问题及其处理解决方法. 1Docker 迁移存储 ...

  5. 产品路线图详解:主要功能、常见类型和线路图构建技巧

    产品路线图是一个高级战略文档,它描绘了产品开发的一般阶段,主要目的是将产品的愿景与公司的业务目标联系起来,它记录了产品的执行策略和总体目标. 产品路线图示例 产品路线图是战略规划的结果,它通常包括以下 ...

  6. php常见后门,php后门隐藏技巧大全

    1. attrib +s +h 创建系统隐藏文件: attrib +s +a +r +h attrib +s +h 文件名 在 Windows 10下即使开启了显示隐藏的项目,或dir仍然看不见. 2 ...

  7. 【面试】—常见面试问题,面试技巧和注意事项

    1.请你自我介绍一下你自己? 回答提示:往往大多数人在回答这个问题时,只说姓名.年龄.爱好.工作经验,这些在简历上都有.(面试官不瞎又不是看不到) 一家企业最希望知道的是求职者能否胜任工作,包括:最强 ...

  8. Python常见的30个编程技巧,下手如有神助

    直接交换2个数字的位置 Python 提供了一种直观的方式在一行代码中赋值和交换(变量值).如下所示: x, y = 10, 20 print(x, y)x, y = y, x print(x, y) ...

  9. IOS开发常见BUG和一些小技巧(PS:耐心看完,很实用)

    本文转载至 http://www.cnblogs.com/huayuan320/p/5777610.html [385][scrollView不接受点击事件,是因为事件传递失败] // // MySc ...

最新文章

  1. 【PC工具】图片批量添加水印工具,绿色免安装工具软件
  2. Ubuntu 安装 Docker 容器
  3. Java并发编程—ThreadLocal用法详解
  4. Oracle ORA-00903:表名无效
  5. 大数据 -- Hadoop集群环境搭建
  6. 死磕 java集合之TreeMap源码分析(三)- 内含红黑树分析全过程
  7. myisam和innodb
  8. Oracle Database Gateway 安装
  9. 兼容input 文件选择_「HTML5」FileAPI 文件操作实战
  10. 源码编译CWM Recovery
  11. 免费的asp.net 2.0空间
  12. 泛函分析 笔者一学期整理 感谢朱老师
  13. 去水印小程序好做吗?赚钱吗?
  14. 计算机无法加载引导,硬盘找不到无法读取MBR(硬盘的主引导记录)故障分析及解决技巧...
  15. 【车载】【ADC】通俗易懂ADC
  16. 帆软思迈特软件Smartbi两家区别在哪里?
  17. 游标+bulk collect into limit的不同方法查询数据
  18. 校园购物平台功能说明
  19. Java学习总结——类和对象
  20. 移动支付之Android HCE的基本使用

热门文章

  1. 现有模型还「不懂」自然语言:20多位研究者谈NLP四大开放性问题
  2. SAP库存历史库存表更新逻辑
  3. 华为:憧憬6G,共同定义6G
  4. AI领域五年引用量最高的10大论文:Adam登顶,AlphaGo、Transfromer上榜
  5. 一个与生命起源有关的悖论终于得到了解决
  6. 2019版中国数字经济发展与就业白皮书
  7. DARPA 2020财年研发预算 人工智能应用研究投资急剧增长
  8. IBM:物联网应重启,否则注定会失望
  9. AI 综述专栏 | 超长综述让你走近深度人脸识别
  10. 人工智能将为传统制造业带来什么?