hibernate中查询方式(二):常用查询
Collection(集合)
列出所有有学生参加的项目:(项目的学生的数量大于0,则表示有学生参加)
public void testCollection() throws Exception {Session session = HibernateUtil.getInstance().getSession();//使用size属性或者SIZE函数来计算一个集合的元素数量放在where条件中是没有区别的// 都是一个子查询完成//String hql = "SELECT proj FROM Project proj WHERE proj.students.size > 0";String hql = "SELECT proj FROM Project proj WHERE SIZE(proj.students) > 0";Query query = session.createQuery(hql);List<Project> list = query.list();for (Project object : list) {System.out.println(object);}session.close();}
---------------------------------------------------------------------------------------------------------------------------------------------------
public void testCollection1() throws Exception {Session session = HibernateUtil.getInstance().getSession();// 判断集合是不是空// IS NOT EMPTY: 不是空,// IS EMPTY:是空, String hql = "SELECT proj FROM Project proj WHERE proj.students IS NOT EMPTY";Query query = session.createQuery(hql);@SuppressWarnings("unchecked")List<Project> list = query.list();for (Project object : list) {System.out.println(object);}session.close();}
列出每个班级中学生的平均龄和最小年龄:(AVG(age),MIN(age))
①:先把学生按班级分组把学生的年龄查出来
select AVG(stu.age),MIN(stu.age) from Student stu group by stu.clazz;
public void testFunction() throws Exception {Session session = HibernateUtil.getInstance().getSession();String hql = "SELECT stu.id, AVG(stu.age), MIN(stu.age) FROM Student stu GROUP BY stu.clazz";Query query = session.createQuery(hql);@SuppressWarnings("unchecked")List<Object[]> list = query.list();for (Object[] object : list) {System.out.println(Arrays.toString(object));}session.close();} }
join(多表联合查询):
列出所有学生的名字对应的班级的名字:
select stu.name,clz.name From Student stu,Clazz clz Where stu.clz=clz (当学生的班级等于班级的时候)
①:隐式连接
public void Jointest() {Session session = BuildSesssionFactory.getSession();String sql = "SELECT stu.name,clz.name FROM Student stu,Clazz clz WHERE stu.clz=clz";Query createQuery = session.createQuery(sql);@SuppressWarnings("unchecked")List<Object[]> list = createQuery.list();for (Object[] objects : list) {System.out.println(Arrays.toString(objects));}}
②:显示连接 join
select stu.name,clz.name From Student stu join Clazz clz on stu.clz=clz (当学生的班级等于班级的时候) 不能这么写
HQL语句按照上面那么写会报错:org.hibernate.hql.internal.ast.QuerySyntaxException: unexpected token: on near line 1, column 68 [select stu.name,clz.name From daomian.Student stu join Clazz clz on stu.clz=clz]
SELECT stu.name,clz.name FROM Student stu JOIN stu.clz clz
public void Jointest1() {Session session = BuildSesssionFactory.getSession();//通过Student 对象中Clazz 连接,Student中的外键找Clazz中的主键String sql = "SELECT stu.name,clz.name FROM Student stu JOIN stu.clz clz";Query createQuery = session.createQuery(sql);List<Object[]> list = createQuery.list();for (Object[] objects : list) {System.out.println(Arrays.toString(objects));} }
limit(分页):
select stu from Student stu LIMIT 0,2; 不能这么写 HQL中不支持LIMIT关键字
HQL语句按照上面那么写会报错org.hibernate.hql.internal.ast.QuerySyntaxException: unexpected token: LIMIT near line 1, column 38 [select stu from daomian.Student stu LIMIT 0,2]
public void testLimit() throws Exception {Integer pageNo = 2;Integer pageSize = 10;// HQL中不支持LIMIT关键字Session session = HibernateUtil.getInstance().getSession();String hql = "SELECT stu FROM Student stu";Query query = session.createQuery(hql);// firstResult: 从数据库中的第几条数据开始查询query.setFirstResult((pageNo - 1) * pageSize);// maxResults: 表示本次分页的最大条数 query.setMaxResults(pageSize);List<Student> list = query.list();for (Student object : list) {System.out.println(object);}session.close();}
Namedquery:
// NamedQuery:主要是为了一些经常使用,但是又不愿意每次都写时用
// 在类的映射文件中添加一个标签,在class标签外添加一个query
// 在属性name中来指定这个NamedQuery指定属性,
// 在XML的innerTest中编写HQL语句
public void namedQuerytest() {Session session = BuildSesssionFactory.getSession();Query namedQuery = session.getNamedQuery("QUERY_ALL_STUDENT");@SuppressWarnings("unchecked")List<Student> list = namedQuery.list();for (Student student : list) {System.out.println(student);}// NamedQuery:主要是为了一些经常使用,但是又不愿意每次都写时用// 在类的映射文件中添加一个标签,在class标签外添加一个query// 在属性name中来指定这个NamedQuery指定属性,// 在XML的innerTest中编写HQL语句}
<query name="QUERY_ALL_STUDENT">SELECT stu FROM Student stu</query>//在Student对象对应的xml中配置 这里的query标签中的name属性和java代码中session.getNamedQuery中的值是一样的
paramenter:(查询参数设置)
①:位置占位符
public class ParamenterTest {// 查询参数设置:// 1、位置占位符:就是使用`?`号来代表查询参数,// 通过setParameter(index,object)来根据?的位置来设置参数的; @Testpublic void positionTest() {Session session = BuildSesssionFactory.getSession();String sql = "select stu from Student stu Where stu.age between ? and ?";Query createQuery = session.createQuery(sql);createQuery.setParameter(0, 18);createQuery.setParameter(1, 20);@SuppressWarnings("unchecked")List<Student> list = createQuery.list();for (Student student : list) {System.out.println(student);}session.close();}
②:名称占位符
// 2、名称占位符:就是使用`:paramName`号来代表查询参数,// 通过setParamter(String name,object)这个方法为名称给占位符添加参数; @Testpublic void nameTest() {Session session = BuildSesssionFactory.getSession();String sql = "select stu from Student stu Where stu.age between :small and :big";Query createQuery = session.createQuery(sql);createQuery.setParameter("small", 18);createQuery.setParameter("big", 20);@SuppressWarnings("unchecked")List<Student> list = createQuery.list();for (Student student : list) {System.out.println(student);}session.close();}
用名称占位符的时候,要注意查询语句里边应该是(: 别名)
设置值的时候为 createQuery.setParameter("别名",值);
Result:(返回结果)
①:查询学生的总数:
Select COUNT(stu) FROM Student stu;
public class ResultTest {@Test@SuppressWarnings("unchecked")public void ResulTest() {Session session = BuildSesssionFactory.getSession();String sql = "SELECT COUNT(stu.id) FROM Student stu";Query createQuery = session.createQuery(sql);List<Long> list = createQuery.list();for (Long long1 : list) {System.out.println(long1);} }
--------------------------------------------------------------------------------------------------------------------------------------------------------
//当查询结果为单条记录的时候,不需要调用list()方法,只需要调用uniqueResult()方法即可 @Testpublic void ResulTest1() {Session session = BuildSesssionFactory.getSession();String sql = "SELECT COUNT(stu.id) FROM Student stu";Query createQuery = session.createQuery(sql);Long long1 = (Long) createQuery.uniqueResult();System.out.println(long1);}
②:返回一个Object[]:
Select stu.id,stu.name,stu.age FROM Student stu;
public void ResulTest2() {Session session = BuildSesssionFactory.getSession();String sql = "SELECT stu.id,stu.name,stu.age FROM Student stu";Query createQuery = session.createQuery(sql);@SuppressWarnings("unchecked")List<Object[]> list = createQuery.list();for (Object[] objects : list) {System.out.println(Arrays.toString(objects));}}
③:返回一个list集合
Select new LIST(stu.id,stu.name,stu.age) FROM Student stu;
public void ResulTest3() {Session session = BuildSesssionFactory.getSession();String sql = "SELECT NEW LIST(stu.id,stu.name,stu.age) FROM Student stu";Query createQuery = session.createQuery(sql);@SuppressWarnings("unchecked")List<List<Student>> list = createQuery.list();for (List<Student> list2 : list) {System.out.println(list2);}}
②:返回一个Map集合
Select new MAP(stu.id,stu.name,stu.age) FROM Student stu;
public void ResulTest4() {Session session = BuildSesssionFactory.getSession();String sql = "SELECT NEW MAP(stu.id ,stu.name,stu.age) FROM Student stu";Query createQuery = session.createQuery(sql);@SuppressWarnings("unchecked")List<Map<String,Student>> list = createQuery.list();for (Map<String, Student> map : list) {System.out.println(map);}}
⑤: new Map 给KEY值起一个别名
Select new MAP(stu.id AS ID,stu.name AS NAME,stu.age AS AGE) FROM Student stu; AS不能省略
public void ResulTest5() {Session session = BuildSesssionFactory.getSession();String sql = "SELECT NEW MAP(stu.id as ID ,stu.name AS NAME,stu.age AS AGE) FROM Student stu";Query createQuery = session.createQuery(sql);@SuppressWarnings("unchecked")List<Map<String,Student>> list = createQuery.list();for (Map<String, Student> map : list) {System.out.println(map);}}
⑥: new 一个对象 Class 没有配置写全限定名称 VO对象 ValueObject
SELECT NEW StudentVO类的全限定名称(id,name,age) FROM Student stu
public class StudentVO {private Long id;private String name;private Integer age; //此处省略getter/setter方法 }
public void ResulTest6() {Session session = BuildSesssionFactory.getSession();String sql = "SELECT NEW hibernate.query.result.StudentVO(id,name,age) FROM Student stu";Query createQuery = session.createQuery(sql);@SuppressWarnings("unchecked")List<StudentVO> list = createQuery.list();for (StudentVO student : list) {System.out.println(student);}}
7: new一个对象 在映射文件中配置Class(在FROM的那个对象的映射文件中配置)
SELECT NEW StudentVO(id,name,age) FROM Student stu
<import class="hibernate.query.result.StudentVO" rename="StudentVO"/> //在class标签外 在hibernate-mapping标签内写
public class StudentVO {private Long id;private String name;private Integer age; //此处省略getter/setter方法 }
public void ResulTest7() {Session session = BuildSesssionFactory.getSession();String sql = "SELECT NEW StudentVO(id,name,age) FROM Student stu";Query createQuery = session.createQuery(sql);@SuppressWarnings("unchecked")List<StudentVO> list = createQuery.list();for (StudentVO student : list) {System.out.println(student);}}
转载于:https://www.cnblogs.com/zhang-bo/p/6628766.html
hibernate中查询方式(二):常用查询相关推荐
- mysql筛选字符个数为8的_听说Mysql你很豪横?-------------分分钟带你玩转SQL高级查询语句(常用查询,正则表达式,运算符)...
一 . 常用查询介绍 1.创建表结构并插入内容 创建一个表 里面有id 毕业院校 家庭住址 name mysql> create table gou(id int primary key,sch ...
- Kibana 使用 KQL 查询语法-kibana 常用查询语法
Kibana 查询语言 (KQL) 是一种使用自由文本搜索或基于字段的搜索过滤 Elasticsearch 数据的简单语法. KQL 仅用于过滤数据,并没有对数据进行排序或聚合的作用. KQL 能够在 ...
- MongoDB 查询语法与常用查询语句总结
MongoDB 常用查询语句总结 先来一波查询语句语法的基本解释: 列子: db.mycol.find({"likes": {$gt:10}, $or: [{"by&qu ...
- Mysql中的七种常用查询连接详解
目录 一.概述 二.连接查询的分类 三.七种常用连接查询详解 1.笛卡尔积: 2.内连接 2.1隐式与显式连接 ?2.2等值连接 ?2.3非等值连接 ?2.4自连接 3外连接 3.1左外连接: ?3. ...
- hibernate中各种不一样的查询hql,hqc(一)
1,使用criteria查询 List list = getHibernateTemplate().executeFind(new HibernateCallback() { ...
- Elasticsearch--进阶-进阶两种查询方式_request uri查询和query DSL查询---全文检索引擎ElasticSearch工作笔记009
然后我们再来去查询高级一点的检索 1.可以看到在es中,支持两种方式的查询,一种是基于rest request uri,把请求的信息,放到http的地址上. 2.第二种方式就是使用REST reque ...
- php实现星座查询,php-十二星座查询系统(原创)
function getstar($m,$d){ if($m==1){ if($d<21){ return "魔羯"; }else{ return "水瓶" ...
- Hibernate 学习笔记(二)—— Hibernate HQL查询和 QBC 查询
目录 一.Hibernate 的 HQL 查询 1.1.查询所有数据 1.2.条件查询 1.3.排序查询 1.4.统计查询 1.5.分页查询 1.6.投影查询 二.Hibernate 的 QBC 查询 ...
- Hibernate查询方式
Hibernate查询方式 1 OID查询 (1)根据id查询某一条记录,返回对象 2 对象导航查询 (1)根据id查询某个公司,再查询这个公司里面所有的员工 Company c=session. ...
最新文章
- python占多少空间_Python如何查看变量占用空间大小
- Invalid bound statement (not found)
- 从入门到深入Fiddler 2 (二)
- mpmath.psi python_【Python Package】mpmath学习笔记(2)
- Open vswitch 之Qos rate-limiting 原理
- 一套鼠标键盘操作两台电脑的方法
- python写连点脚本_python鼠标连点器-测试版
- iOS 9适配技巧(更新版)
- L1-7 机工士姆斯塔迪奥
- 本机电脑清除DNS缓存+浏览器清除DNS缓存
- 找错:maven常见错误
- 安卓自动滑屏脚本_自动滑屏软件下载-自动滑屏 安卓版v3.1.0-PC6安卓网
- vue 二级路由嵌套和二级路由高亮问题
- 中科大脑知识图谱平台建设及业务实践
- python 语音识别培训使用Python和Keras创建简单语音识别引擎
- python爬取网页返回响应中出现百度安全验证的解决办法
- scrapy 下载及处理文件和图片
- 10 个开源免费的电子商务平台
- UML建模工具Astah Pro教程
- 无线通信设计秘密四:唤醒下发算法
热门文章
- HTML5 响应式网页设计之页面美化(二.媒体查询)
- JavaScript内置对象导读(1)
- 枚举+贪心--经常用到的思路--过程不好弄是--枚举结果C. Elections
- C++中如何读取一个数的位数_初中数学:近似数和平均数知识点总结及练习
- SQL面试题(1-10)oracle写的
- bzoj 1055: [HAOI2008]玩具取名(区间DP)
- bzoj 1032: [JSOI2007]祖码Zuma(区间DP)
- [paper reading] CornerNet
- paper reading:Part-based Graph Convolutional Network for Action Recognition
- shell bash常用工具教程(curl,jq)