八、hibernate的查询(HQL)
HQL:Hibernate Query Language
- 提供更加丰富灵活、更为强大的查询能力
- HQL更接近SQL语句查询语法
- 面向对象的查询
- "from Children where cid<?" :这里Children指的是类不是children表;cid指的是Children类中的对象而不是children表中的字段
HQL查询(单表)
以一对多关系映射为例(parent[1]<——>children[n])
简单查询
实体类
1.Parent.java
package com.qf.entity; import java.util.HashSet;
import java.util.Set; public class Parent { private Long pid;
private String pname;
private Integer age;
private Set<Children> childs = new HashSet<>(); @Override
public String toString() {
return "Parent [pid=" + pid + ", pname=" + pname + ", age=" + age + "]";
} public Long getPid() {
return pid;
}
public void setPid(Long pid) {
this.pid = pid;
}
public String getPname() {
return pname;
}
public void setPname(String pname) {
this.pname = pname;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public Set<Children> getChilds() {
return childs;
}
public void setChilds(Set<Children> childs) {
this.childs = childs;
} }
2.Children.java
package com.qf.entity;
public class Children {
private Long cid;
private String cname;
private Character sex;
private Parent p;
@Override
public String toString() {
return "Children [cid=" + cid + ", cname=" + cname + ", sex=" + sex + ", p=" + p + "]";
}
public Long getCid() {
return cid;
}
public void setCid(Long cid) {
this.cid = cid;
}
public String getCname() {
return cname;
}
public void setCname(String cname) {
this.cname = cname;
}
public Character getSex() {
return sex;
}
public void setSex(Character sex) {
this.sex = sex;
}
public Parent getP() {
return p;
}
public void setP(Parent p) {
this.p = p;
}
}
注:两个实体类的toString()方法重写时
- Parent类的toString()方法如果包含Set<Children>的属性,那么Children类的toString()方法就不能包含Parent的属性,否则查询输出对象信息时会陷入死循环,导致StackOverflowError
package com.qf.util; import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration; public class HibernateUtils { private static Configuration cfg ;
private static SessionFactory factory; static {
cfg = new Configuration().configure();
factory = cfg.buildSessionFactory();
} public static Session getCurrentSession() {
return factory.getCurrentSession();
}
}
@Test
/**
* HQL简单查询
*/
public void queryByHQL() {
Session session = HibernateUtils.getCurrentSession();
Transaction tx = session.beginTransaction(); Query query = session.createQuery("from Children");
List<Children> list = query.list(); for (Children children : list) {
System.out.println(children);
} tx.commit();
}
别名查询
String hql = "select c from Children c order by cid desc";
HQL中支持数据库的带有别名的查询
@Test
/**
* HQL别名查询
*/
public void queryByHQL02() {
Session session = HibernateUtils.getCurrentSession();
Transaction tx = session.beginTransaction(); // String hql = "select c from Children c";
String hql = "select c from Children c order by cid desc";
Query query = session.createQuery(hql);
List<Children> list = query.list(); for (Children children : list) {
System.out.println(children);
} tx.commit();
}
条件查询
参数绑定
- 位置绑定
String hql = "select c from Children c where cid<? and cname like ?";
Query query = session.createQuery(hql);
query.setParameter(0, 20L);
query.setParameter(1, "%张%");
- hql中参数以"?"代替
- 索引从0开始
- 名称绑定
String hql = "select c from Children c where cid<:aaa and cname like :bbb";
Query query = session.createQuery(hql);
query.setParameter("aaa", 20L);
query.setParameter("bbb", "%张%");
- hql中参数以 ":自定义名称"的形式代替
- 不使用索引,使用(名称,值)的形式
@Test
/**
* HQL条件查询
*/
public void queryByHQL03() {
Session session = HibernateUtils.getCurrentSession();
Transaction tx = session.beginTransaction(); /*//一个条件(位置绑定)
String hql = "select c from Children c where cid<?";
Query query = session.createQuery(hql);
query.setInteger(0, 3);*/ //多个条件(位置绑定)
/*String hql = "select c from Children c where cid<? and cname like ?";
Query query = session.createQuery(hql);
query.setParameter(0, 20L);
query.setParameter(1, "%张%");*/ //多个条件(名称绑定)
String hql = "select c from Children c where cid<:aaa and cname like :bbb";
Query query = session.createQuery(hql);
query.setParameter("aaa", 20L);
query.setParameter("bbb", "%张%"); List<Children> list = query.list(); for (Children children : list) {
System.out.println(children);
} tx.commit();
}
投影查询
查询表中部分字段
方式一:返回Object[ ]
@Test
/**
* HQL简单查询
*/
public void queryByHQL() {
Session session = HibernateUtils.getCurrentSession();
Transaction tx = session.beginTransaction(); Query query = session.createQuery("select cname,sex from Children");
List<Object[]> list = query.list(); for (Object[] objs : list) {
System.out.println(Arrays.toString(objs));
}
tx.commit();
}
方式二:返回实体类对象
实体类
- 添加无参构造方法
- 添加有参构造方法(构造方法参数是你所要查询的属性)
package com.qf.entity;
public class Children {
private Long cid;
private String cname;
private Character sex;
private Parent p;
public Children(String cname, Character sex) {
super();
this.cname = cname;
this.sex = sex;
}
public Children() {
super();
}
......
}
测试方法
@Test
/**
* HQL简单查询
*/
public void queryByHQL() {
Session session = HibernateUtils.getCurrentSession();
Transaction tx = session.beginTransaction(); Query query = session.createQuery("select new Children(cname,sex) from Children");
List<Children> list = query.list(); for (Children children : list) {
System.out.println(children);
}
tx.commit();
}
分页查询
- query.setFirstResult(int start):从第几条记录开始查询
- query.setMaxResults(int num):本页一共查询多少条记录
@Test
public void query() {
Session session = HibernateUtils.getCurrentSession();
Transaction tx = session.beginTransaction(); String sql = "from Children";
Query query = session.createQuery(sql);
query.setFirstResult(2);
query.setMaxResults(3);
List<Children> list = query.list();
for (Children c : list) {
System.out.println(c);
} tx.commit();
}
分组查询
max()、min()、count()、sum()、avg()
Object obj = query.uniqueResult():返回唯一结果
@Test
/**
* HQL简单查询
*/
public void queryByHQL() {
Session session = HibernateUtils.getCurrentSession();
Transaction tx = session.beginTransaction(); Query query = session.createQuery("select pid,pname,count(*) from Parent group by pid"); List<Object[]> list = query.list(); for (Object[] objects : list) {
System.out.println(Arrays.toString(objects));
} tx.commit();
}
HQL查询(多表)
内连接查询
正常的内连接sql:select * from Children c inner join Parent p
HQL:"from Children c inner join c.p "
- 其中c.p是Children类的Parent属性变量p
- 返回的是对象数组
package com.qf.entity;
public class Children {
private Long cid;
private String cname;
private Character sex;
private Parent p;
....
}
@Test
/**
* HQL简单查询
*/
public void queryByHQL() {
Session session = HibernateUtils.getCurrentSession();
Transaction tx = session.beginTransaction(); Query query = session.createQuery("from Children c inner join c.p "); List<Object[]> list = query.list(); for (Object[] objects : list) {
System.out.println(Arrays.toString(objects));
} tx.commit();
}
------------------------------console-------------------------------
[Children [cid=1, cname=张三8, sex=1, p=Parent [pid=1, pname=老张, age=45]], Parent [pid=1, pname=老张, age=45]]
[Children [cid=2, cname=张三0, sex=0, p=Parent [pid=1, pname=老张, age=45]], Parent [pid=1, pname=老张, age=45]]
[Children [cid=3, cname=张三2, sex=1, p=Parent [pid=1, pname=老张, age=45]], Parent [pid=1, pname=老张, age=45]]
...............
[Children [cid=28, cname=王五0, sex=0, p=Parent [pid=3, pname=老王, age=43]], Parent [pid=3, pname=老王, age=43]]
[Children [cid=29, cname=王五8, sex=0, p=Parent [pid=3, pname=老王, age=43]], Parent [pid=3, pname=老王, age=43]]
[Children [cid=30, cname=王五6, sex=1, p=Parent [pid=3, pname=老王, age=43]], Parent [pid=3, pname=老王, age=43]]
迫切内连接
Query query = session.createQuery("from Children c inner join fetch c.p ");
- 普通内连接HQL的inner join后加上fetch即可
- 效果:返回的是内连接的左边对象(该例中Parent作为Children属性)
@Test
/**
* HQL简单查询
*/
public void queryByHQL() {
Session session = HibernateUtils.getCurrentSession();
Transaction tx = session.beginTransaction(); Query query = session.createQuery("from Children c inner join fetch c.p "); List<Children> list = query.list(); for (Children c : list) {
System.out.println(c);
} tx.commit();
}
------------------------------console-------------------------------
Children [cid=1, cname=张三8, sex=1, p=Parent [pid=1, pname=老张, age=45]]
Children [cid=2, cname=张三0, sex=0, p=Parent [pid=1, pname=老张, age=45]]
Children [cid=3, cname=张三2, sex=1, p=Parent [pid=1, pname=老张, age=45]]
....................
Children [cid=28, cname=王五0, sex=0, p=Parent [pid=3, pname=老王, age=43]]
Children [cid=29, cname=王五8, sex=0, p=Parent [pid=3, pname=老王, age=43]]
Children [cid=30, cname=王五6, sex=1, p=Parent [pid=3, pname=老王, age=43]]
左外连接、右外连接(没有迫切右外连接)以及迫切左外连接使用也类似
八、hibernate的查询(HQL)的更多相关文章
- Hibernate的查询 HQL查询 查询某几列
HQL 是Hibernate Query Language的简写,即 hibernate 查询语言:HQL采用面向对象的查询方式.HQL查询提供了更加丰富的和灵活的查询特性,因此Hibernate将H ...
- Hibernate中关于HQL查询返回List<Object>数据的结果集问题
---恢复内容开始--- 开发中遇到的一个小问题,使用Hibernate中的HQL查询时,使用query.list()查询出来的是一个List<Object>结果集 原来代码: publi ...
- 二。Hibernate 查询 HQL、SQL方式
hibernate的查询1.HQL方式:所有查询都是根据java对象名来完成,对象名替换表名2.SQL方式:保留原来的sql查询风格3.可以通过设置第一条和最大条数来实现各种数据库的分页查询4.通过B ...
- 【Hibernate步步为营】--hql查询小介
HQL 是指Hibernate Query Language,它是Hibernate的查询语言,拥有一套自己的查询机制,它的查询语句和SQL非常类似.在使用的时候可以非常快上手.HQL提供了基本上SQ ...
- hibernate学习系列-----(4)hibernate基本查询上篇:HQL基本查询
紧接着上一篇,今天继续hibernate的学习总结,来聊一聊hibernate的基本查询方法,先说说HQL(hibernate Query Language):它是官方推荐的查询语言.在开始写代码之前 ...
- Hibernate【查询、连接池、逆向工程】
前言 在Hibernate的第二篇中只是简单地说了Hibernate的几种查询方式....到目前为止,我们都是使用一些简单的主键查询阿...使用HQL查询所有的数据....本博文主要讲解Hiberna ...
- hibernate模糊查询
hibernate模糊查询-Restrictions.ilike & Expression.like Criteria criteria = session.createCriteria(Ta ...
- HQL查询——HQL查询的基本用法
HQL查询--HQL查询的基本用法 1.HQL语法类似于SQL语法,但是需要注意的是,HQL是一种完全面向对象的查询语言.SQL语言操作的对象是数据表.列等数据库对象,而HQL语言的操作对象是类.实例 ...
- Hibernate的查询方式总结
Hibernate的查询方式大体有三种,分别是HQL QBC和SQL三种.在网上查阅一一些资料,做了一个简单的总结. 1. SQL sql 是面向数据库表查询,from 后面跟的是表名,where 后 ...
- Hibernate SQL查询 addScalar()或addEntity()
本文完全引用自: http://www.cnblogs.com/chenyixue/p/5601285.html Hibernate除了支持HQL查询外,还支持原生SQL查询. 对原 ...
随机推荐
- kafka2.3集群搭建
环境: 3台centos7.4 3台zookeeper3.4.14 1. wget http://mirror.bit.edu.cn/apache/kafka/2.3.0/kafka_2.11-2.3 ...
- AES apache commons-crypto 对称加密
apache实现的AES256加密 官方用户指导链接:http://commons.apache.org/proper/commons-crypto/userguide.html 官方字节缓存实现的例 ...
- 【LeetCode】图论 graph(共20题)
[133]Clone Graph (2019年3月9日,复习) 给定一个图,返回它的深拷贝. 题解:dfs 或者 bfs 都可以 /* // Definition for a Node. class ...
- vue tab切换布局
页面 功能 点击tab1和tab2,content内容切换content1和content2 <template> <div> <div class="tab& ...
- python基础:1.位、字节、字的关系
1.位,简称b,或bit,比特,数据存储的最小单位.每个二进制数字0或1就是一个位(bit),网络通信常用bps,bit per second ,每秒传输多少位 2.字节,简称byte, 1byte ...
- linux开机启动jar
一.使用系统文件rc.local 启动命令可添加在/etc/rc.local(链接地址为/etc/rc.d/rc.local)中即可开机启动,不建议使用此种方法. 二.自定义启动脚本 1.新建启动脚本 ...
- 提高wifi速度的设置办法
系列的提高wifi速度的设置办法 在DNS一栏有你们家的地址,在你们家的地址前输入“114.114.114.114”并以“,”结尾(注意:要用英文输入法哦.) 设置完后点击左上角的“无线局域网”回到初 ...
- MIS(管理信息系统)
MIS 管理信息系统(Management Information System,简称MIS) 是一个以人为主导,利用计算机硬件.软件.网络通信设备以及其他办公设备,进行信息的收集.传输.加工.储存. ...
- MacOS Catalina 导致bash命令失效的一些总结
欢天喜地的升级了最新的OS后,第一个发现bash失效的是使用pod命令出现: -bash: pod: command not found 这个不会导致cocoapods无法正常使用,可以使用绝对路径里 ...
- 27 October in ss
Contest A. chrono 计算某年的干支纪年法年份. Too easy. 然而我忘记 C++ 取模运算是向0取整.然而数据太水,还是有 90 分. B. clock 计算某时刻时针和分针的夹 ...