Hibernate中Hql查询

 

这篇随笔将会记录hql的常用的查询语句,为日后查看提供便利。

在这里通过定义了三个类,Special、Classroom、Student来做测试,Special与Classroom是一对多,Classroom与Student是一对多的关系,这里仅仅贴出这三个bean的属性代码:

Special类:

复制代码
复制代码
public class Special
{private int id;private String name;private String type;private Set<Classroom> rooms;..........
}
复制代码
复制代码

Classroom类:

复制代码
复制代码
public class Classroom
{private int id;private String name;private Special special;private Set<Student> students;............
}
复制代码
复制代码

Student类:

复制代码
复制代码
public class Student
{private int id;private String name;private String sex;private Classroom room;..........
}
复制代码
复制代码

1.最简单的查询

List<Special> specials = (List<Special>)session.createQuery("select spe from Special spe").list();

这是hql最基本的查询语句了,作用就是查出所有的Special对象放到一个List当中

2.基于 ? 的参数化形式

复制代码
复制代码
       /*** 查询中使用?,通过setParameter的方式可以防止sql注入* jdbc的setParameter的下标从1开始,hql的下标从0开始*/List<Student> students = (List<Student>)session.createQuery("select stu from Student stu where name like ?").setParameter(0, "%刘%").list();
复制代码
复制代码

 

在hql中同样支持基于 ? 的参数化形式查询,注意:在jdbc中,setParameter的下标是从1开始的,而hibernate的setParameter的下标是从0开始的。

3.基于 :xx 的别名的方式设置参数

复制代码
       /*** 在hql中可以使用别名的方式来查询,格式是 :xxx 通过setParameter来设置别名*/List<Student> students = (List<Student>)session.createQuery("select stu from Student stu where name like :name and sex like :sex").setParameter("name", "%王%").setParameter("sex", "%男%").list();
复制代码

4.如果返回的值只有一个,可以使用uniqueResult方法

复制代码
复制代码
       /*** 如果得到的值只有一个,则可以使用uniqueResult方法*/Long stu = (Long)session.createQuery("select count(*) from Student stu where name like :name and sex like :sex").setParameter("name", "%王%").setParameter("sex", "%男%").uniqueResult();/*** 如果得到的值只有一个,则可以使用uniqueResult方法*/Student stu = (Student)session.createQuery("select stu from Student stu where id = ?").setParameter(0, 1).uniqueResult();
复制代码
复制代码

5.基于投影的查询

复制代码
复制代码
       /*** 基于投影的查询,如果返回多个值,这些值都是保存在一个object[]数组当中*/List<Object[]> stus = (List<Object[]>)session.createQuery("select stu.name, stu.sex from Student stu where name like 
                            :name and sex like :sex").setParameter("name", "%张%").setParameter("sex", "%男%").list();
复制代码
复制代码

6.基于导航对象的查询

复制代码
复制代码
       /*** 如果对象中有导航对象,可以直接通过对象导航查询*/List<Student> stus = (List<Student>)session.createQuery("select stu from Student stu where stu.room.name like :room and sex like :sex").setParameter("room", "%计算机应用%").setParameter("sex", "%女%").list();
复制代码
复制代码

注意:若直接通过导航对象来查询时,其实际是使用cross join(笛卡儿积)来进行连接查询,这样做性能很差,不建议使用

7.使用 in 进行列表查询

复制代码
复制代码
       /*** 可以使用in设置基于列表的查询,使用in查询时需要使用别名来进行参数设置,* 通过setParameterList方法即可设置,在使用别名和?的hql语句查询时,?形式的查询必须放在别名前面*/
//            List<Student> stus = (List<Student>)session.createQuery("select stu from Student stu where sex like ? and stu.room.id in (:room)")
//                                                .setParameter(0, "%女%").setParameterList("room", new Integer[]{1, 2})
//                                                .list();List<Student> stus = (List<Student>)session.createQuery("select stu from Student stu where stu.room.id in (:room) and stu.sex like :sex").setParameterList("room", new Integer[]{1, 2}).setParameter("sex", "%女%").list();
复制代码
复制代码

在使用 in 进行列表查询时,这个时候要通过 setParameterList() 方法来设置我们的参数,注意:如果一个参数通过别名来传入,一个是通过 ? 的方式来传入的话,那么通过别名的hql语句以及参数设置语句要放在 ? 的后面,不然hibernate会报错。如果都是使用 别名 来设置参数,则无先后顺序

8.分页查询

复制代码
复制代码
       /*** 通过setFirstResult(0).setMaxResults(10)可以设置分页查询,相当于offset和pagesize*/List<Student> stus = (List<Student>)session.createQuery("select stu from Student stu where stu.room.name like :room and sex like :sex").setParameter("room", "%计算机应用%").setParameter("sex", "%女%").setFirstResult(0).setMaxResults(10).list();
复制代码
复制代码

9.内连接查询

复制代码
       /***    使用对象的导航查询可以完成连接查询,但是使用的是Cross Join(笛卡儿积),效率不高,所以建议使用join来查询*/List<Student> stus = (List<Student>)session.createQuery("select stu from Student stu join stu.room room where room.id=2").list();
复制代码

在hql中使用连接查询的语句与我们的sql进行连接查询的语句是有区别的:

hql:    select stu from Student stu join stu.room roomsql:    select t.* from Student t join Classroom c on t.cid=c.id

10.左外连和右外连查询

复制代码
       /***    左外连和右外连其实是相对的,left join 就是以左边的表为基准, right join 就是以右边的表为基准*/List<Object[]> stus = (List<Object[]>)session.createQuery("select room.name, count(stu.room.id) from Student stu right join stu.room room group by room.id").list();
复制代码

11.创建DTO类,将查询出来的多个字段可以存放到DTO对象中去

复制代码
复制代码
       /***    当如果我们查询出多个字段的话,通常会创建一个DTO对象,用来存储我们查询出来的数据,通过 new XXX() 这样的方式*    前提是XXX这个类里面必须要有接受这些字段的构造方法才行,而且必须要使用类的全名*/
//            List<Object[]> stus = (List<Object[]>)session.createQuery("select stu.id,stu.name,stu.sex,room.name,special.name from Student stu left join stu.room room left join room.special special")
//                                                .list();
//            for(Object[] obj : stus)
//            {
//                System.out.println(obj[0] + ", " + obj[1] + ", " + obj[2] + ", " + obj[3] + ", " + obj[4]);
//            }

List<StudentDTO> stus = (List<StudentDTO>)session.createQuery("select new com.xiaoluo.bean.StudentDTO(stu.id, stu.name, stu.sex, room.name, special.name) from Student stu left join stu.room room left join room.special special")
                             .list();
复制代码
复制代码

12.group having字句

复制代码
/*** 在hql中不能通过给查询出来的字段设置别名,别名只能设置在from 后面*/List<Object[]> stus = (List<Object[]>)session.createQuery("select special.name, count(stu.room.special.id) from Student stu right join stu.room.special special group by special.id having count(stu.room.special.id)>150").list();  // 查询出人数大于150个人的专业
复制代码
复制代码
       
       //  查询出每个专业中男生与女生的个数
       List<Object[]> stus = (List<Object[]>)session.createQuery("select special.name, stu.sex, count(stu.room.special.id) from Student stu right join stu.room.special special group by special.id,stu.sex").list();
复制代码

转载于:https://www.cnblogs.com/hq233/p/6525199.html

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

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

相关文章

Java代码质量工具–概述

最近&#xff0c;我有机会在本地IT社区聚会上介绍了该主题。 这是基本演示&#xff1a; Java代码质量工具 以及更有意义的思维导图&#xff1a; 但是&#xff0c;我认为我需要更深入地探讨这一主题。 这篇博客文章应该像是在此方向上进行进一步调查的起点。 1. CodePro Anal…

利用yum升级Centos6的gcc版本,使其支持C++11

下面的可以在centos6下工作&#xff0c;centos7下有问题。可能是因为centos下的scl我是拷贝的文件&#xff0c;没有完全验证centos6下肯定没问题。 https://my.oschina.net/u/583362/blog/682123 和https://www.quyu.net/info/876.html 拷贝其关键内容就是&#xff1a; 1.使用 …

cuda版本查看_ubuntu安装CUDA

0 写在前面安装环境&#xff1a;ubuntu18.04以及GTX1050Ti笔记本为什么要安装CUDA&#xff1f; 参考百科&#xff0c;CUDA是英伟达推出的集成技术&#xff0c;通过该技术可利用GeForce 8 以后的GPU或者较新的Quadro GPU进行计算。例如典型的tensorflow-GPU和pyCUDA安装之前都要…

HTML 标签列表(功能排序) HTML 参考手册- (HTML5 标准)

HTML 标签列表&#xff08;功能排序&#xff09; HTML 参考手册- (HTML5 标准) 功能排序 New : HTML5 新标签 标签描述基础 <!DOCTYPE> 定义文档类型。<html>定义一个 HTML 文档<title>为文档定义一个标题<body>定义文档的主体<h1> to <h6>…

idea新建scala文件_IDEA maven项目中新建.scala文件

本文首发于我的博客[IDEA maven项目中新建.scala文件]分为三步第一步、IDEA中安装scala插件1、搜索安装File-Sittings-Plugins-搜索安装scala2、安装完成重启安装完成之后点击重启idea第二步、下载、安装、配置Scala1、下载安装Scala SDK本体搜索引擎搜索Scala SDK或者点我去Sc…

Linux中执行shell脚本的4种方法总结

文章来源&#xff1a;http://www.jb51.net/article/53924.htm 这篇文章主要介绍了Linux中执行shell脚本的4种方法总结,即在Linux中运行shell脚本的4种方法,需要的朋友可以参考下 bash shell 脚本的方法有多种&#xff0c;现在作个小结。假设我们编写好的shell脚本的文件名为hel…

Log4j线程死锁–案例研究

此案例研究描述了影响Weblogic Portal 10.0生产环境的Apache Log4j线程争用问题的完整根本原因分析和解决方案。 它还将说明在开发和支持Java EE应用程序时适当的Java类加载器知识的重要性。 本文也是您提高线程转储分析技能和了解线程竞争条件的另一个机会。 环境规格 Java …

代码实现:求s=a+aa+aaa+aaaa+aa...a的值,其中a是一个数字

import java.util.Scanner;/*题目&#xff1a;求saaaaaaaaaaaa...a的值&#xff0c;其中a是一个数字。例如222222222222222(此时共有5个数相加)&#xff0c;几个数相加有键盘控制。 程序分析&#xff1a;关键是计算出每一项的值。*/public class Test08 {public static void ma…

堆栈跟踪从何而来?

我认为&#xff0c;阅读和理解堆栈跟踪是每个程序员都必须具备的一项基本技能&#xff0c;以便有效地解决每种JVM语言的问题&#xff08;另请参阅&#xff1a; 过滤日志中无关的堆栈跟踪行和首先记录引起异常的根本原因 &#xff09;。 那么我们可以从一个小测验开始吗&#xf…

@select 怎么写存储过程_MySQL4:存储过程和函数

什么是存储过程简单说&#xff0c;存储过程就是一条或多条SQL语句的集合&#xff0c;可视为批文件&#xff0c;但是起作用不仅限于批处理。本文主要讲解如何创建存储过程和存储函数以及变量的使用&#xff0c;如何调用、查看、修改、删除存储过程和存储函数等。使用的数据库和表…

跨域访问-预请求及跨域常见问题

预请求 参考&#xff1a;https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Access_control_CORS#预请求 简而言之&#xff0c;在跨域并且尝试添加一些特殊头及自定义头的情况下&#xff0c;由于浏览器的安全机制&#xff0c;会加多一次OPTIONS预请求&#xff08;询问请求&am…

mysql查询优化之一:mysql查询优化常用方式

一、为什么查询速度会慢&#xff1f; 一个查询的生命周期大致可以按照顺序来看&#xff1a;从客户端&#xff0c;到服务器&#xff0c;然后在服务器上进行解析&#xff0c;生成执行计划&#xff0c;执行&#xff0c;并返回结果给客户端。其中在“执行”阶段包含了大量为了检索…

修复Sonar中常见的Java安全代码冲突

本文旨在向您展示如何快速修复最常见的Java安全代码冲突。 它假定您熟悉代码规则和违规的概念以及Sonar如何对其进行报告。 但是&#xff0c;如果您以前从未听说过这些术语&#xff0c;则可以阅读Sonar Concepts或即将出版的有关Sonar的书 &#xff0c;以获取更详细的解释。 为…

理解ThreadLocal

ThreadLocal:线程本地存储&#xff0c;为每个线程都创建了变量的副本&#xff0c;线程在访问变量时&#xff0c;可以直接访问自己内部的副本变量。 理解几个概念&#xff1a; 在java中ThreadLocal是一个类。 ThreadMap是一个类&#xff0c; Thread类是线程类。 ThreadLocal…

抖音右上角一个小黄点是什么_抖音官方入驻视频号,释放了一个什么样的信号?...

专注视频号观察第 328 篇这几天&#xff0c;视频号生态新入驻了一个企业号&#xff0c;在圈里引起不少的轰动&#xff0c;因为这个号的名字叫做———抖音。这件事在圈里引发不少的轰动&#xff0c;很多人惊叹&#xff1a;“连抖音都来开视频号了&#xff0c;你还在等什么&…

资源包技巧和最佳实践

今天是资源捆绑日。 通常&#xff0c;这是Java中最著名的国际化机制&#xff08;i18n&#xff09;。 使用它应该很容易。 但是&#xff0c;在弄脏手时会出现许多小问题。 如果您有相同的想法&#xff0c;则此文章适合您。 基本 java.util.ResourceBundle定义了用于访问Java中翻…

springMvc-文件上传

赶时间&#xff0c;又在写垃圾博客&#xff0c;在心里给自己一耳巴 1.单文件上传 2.多文件上传 代码&#xff1a; 页面&#xff1a; <!DOCTYPE html><html><head><meta charset"UTF-8"><title>Insert title here</title></he…

c cuda 指定gpu_GPU并行编程:熟练使用CUDA C语言

【IT168 专稿】一个大任务通常可能被分解成许多可以一起处理的小任务&#xff0c;以便创建一个解决方案&#xff0c;这和粉刷房子的道理是一样的&#xff0c;在粉刷之前&#xff0c;假设你需要买5公升油漆和5把刷子&#xff0c;你可以自己一个人干完采购和粉刷的活&#xff0c;…

js中使用0 “” null undefined {}需要注意

注意&#xff1a;在js中0为空&#xff08;false&#xff09; &#xff0c;代表空的还有“”&#xff0c;null &#xff0c;undefined&#xff1b; 如果做判断if(&#xff01;上面的四种值)&#xff1b;返回均为false console.log(!null);// true console.log(!0);//true consol…

PhpStorm 10.0.3破解版下载

汉化破解版软件下载&#xff1a; http://pan.baidu.com/s/1geNO24r 密码: d5ci 这个汉化破解软件解决了大纲视图里空白的问题。 先安装腾讯电脑管家&#xff0c;然后安装这个软件&#xff0c;安装到最后提示有个文件有病毒已删除&#xff0c;点确定后正常使用。转载于:https://…