Hibernate的五种查询方式
目录
1、简单查询 2、排序查询 3、条件查询 4、投影查询 5、分页查询 6、分组统计查询 7、多表查询
1、简单查询 2、排序查询 3、分页查询 4 、条件查询 5 、统计查询 6 、离线条件查询
Hibernate的查询方式一:OID查询
OID检索:Hibernate根据对象的OID(主键)进行检索
(1) 、使用get方法 :
Customer customer = session.get(Customer.class,1l); //第二个参数 1表示对象OID为 1,l表示OID为 Long类型
(2) 、使用load方法 :
Customer customer = session.load(Customer.class,1l);
Hibernate的查询方式二:对象导航检索
对象导航检索:Hibernate根据一个已经查询到的对象,获得其关联的对象的一种查询方式。
LinkMan linkMan = session.get(LinkMan.class,1l); Customer customer = linkMan.getCustomer(); //获取关联对象
Hibernate的查询方式三:HQL检索(重点)
HQL查询:Hibernate Query Language,Hibernate的查询语言,是一种面向对象的方式的查询语言,语法类似SQL。通过session.createQuery(),用于接收一个HQL进行查询方式。
初始化数据 :通过更改姓名,多次执行程序,创建多个客户及多个联系人
package czm.hibernate.testdemo;
import java.util.List;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.junit.Test;
import czm.hibernate.domain.Customer;
import czm.hibernate.domain.LinkMan;
import czm.hibernate.utils.HibernateUtils;
public class TestDemo {
@Test
/**
* 初始化数据
*/
public void testdemo1() {
Session session = HibernateUtils.getCurrentSession();
Transaction tx = session.beginTransaction();
// 创建一个客户
Customer customer = new Customer();
customer.setCust_name("王五");
for (int i = 1; i <= 10; i++) {
LinkMan linkMan = new LinkMan();
linkMan.setLkm_name("小王" + i);
linkMan.setCustomer(customer);
customer.getLinkMans().add(linkMan);
session.save(linkMan);
}
session.save(customer);
tx.commit();
}
}
客户表3条数据:
联系人表对应30条数据:
利用HQL可做7种查询 :
1、简单查询 2、排序查询 3、条件查询 4、投影查询 5、分页查询 6、分组统计查询 7、多表查询
(1)、HQL的简单查询
package czm.hibernate.testdemo;
import java.util.List;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.junit.Test;
import czm.hibernate.domain.Customer;
import czm.hibernate.domain.LinkMan;
import czm.hibernate.utils.HibernateUtils;
public class TestDemo {
@Test
/**
* HQL的简单查询
*/
public void testdemo02(){
Session session = HibernateUtils.getCurrentSession();
Transaction tx = session.beginTransaction();
//简单查询
//Customer指实体类,完整写法为包+类名称,,但因为有配置文件,包名称可省略不写,只写类名
Query query = session.createQuery("from Customer");
List<Customer> list = query.list();
for (Customer customer : list) {
System.out.println(customer); //打印输出查询结果
}
tx.commit();
}
}
程序运行结果 :
(2)、HQL的排序查询
package czm.hibernate.testdemo;
import java.util.List;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.junit.Test;
import czm.hibernate.domain.Customer;
import czm.hibernate.domain.LinkMan;
import czm.hibernate.utils.HibernateUtils;
public class TestDemo {
@Test
/**
* HQL的排序查询
*/
public void testdemo03(){
Session session = HibernateUtils.getCurrentSession();
Transaction tx = session.beginTransaction();
//排序查询 升序 :asc 降序 :desc
List<Customer> list = session.createQuery("from Customer order by cust_id desc").list();
for (Customer customer : list) {
System.out.println(customer);
}
tx.commit();
}
}
程序运行结果 :
(3)、HQL的条件查询(3种情况)
在数据库表cst_customer中的cust_source字段加入几个参数以供查询
一个条件查询 :
package czm.hibernate.testdemo;
import java.util.List;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.junit.Test;
import czm.hibernate.domain.Customer;
import czm.hibernate.domain.LinkMan;
import czm.hibernate.utils.HibernateUtils;
public class TestDemo {
@Test
/**
* HQL的条件查询
*/
public void testdemo04(){
Session session = HibernateUtils.getCurrentSession();
Transaction tx = session.beginTransaction();
// 条件的查询
// 一、按位置绑定:根据参数的位置进行绑定。
// 一个条件
Query query = session.createQuery("from Customer where cust_name = ?");
query.setParameter(0, "张三"); List<Customer> list = query.list();
for (Customer customer : list) {
System.out.println(customer);
}
tx.commit();
}
}
程序运行结果 :
多个条件查询 :
package czm.hibernate.testdemo;
import java.util.List;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.junit.Test;
import czm.hibernate.domain.Customer;
import czm.hibernate.domain.LinkMan;
import czm.hibernate.utils.HibernateUtils;
public class TestDemo {
@Test
/**
* HQL的条件查询
*/
public void testdemo04(){
Session session = HibernateUtils.getCurrentSession();
Transaction tx = session.beginTransaction();
// 条件的查询
// 一、按位置绑定:根据参数的位置进行绑定。
// 多个条件
Query query = session.createQuery("from Customer where cust_source = ? and cust_name like ?");
query.setParameter(0, "程序员"); query.setParameter(1, "李%");
List<Customer> list = query.list();
for (Customer customer : list) {
System.out.println(customer);
}
tx.commit();
}
}
程序运行结果 :
名称绑定查询 :
package czm.hibernate.testdemo;
import java.util.List;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.junit.Test;
import czm.hibernate.domain.Customer;
import czm.hibernate.domain.LinkMan;
import czm.hibernate.utils.HibernateUtils;
public class TestDemo {
@Test
/**
* HQL的条件查询
*/
public void testdemo04(){
Session session = HibernateUtils.getCurrentSession();
Transaction tx = session.beginTransaction();
// 条件的查询
// 二、按名称绑定
Query query = session.createQuery("from Customer where cust_source = :a and cust_name like :b"); //a 和 b 为自定义名称 ,冒号和名称之间不能有空格之类的
// 设置参数:
query.setParameter("a", "博士生");
query.setParameter("b", "王%");
List<Customer> list = query.list();
for (Customer customer : list) {
System.out.println(customer);
}
tx.commit();
}
}
程序运行结果 :
(4)、HQL的投影查询
投影查询:查询对象的某个或某些属性。
单个属性查询
package czm.hibernate.testdemo;
import java.util.Arrays;
import java.util.List;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.junit.Test;
import czm.hibernate.domain.Customer;
import czm.hibernate.domain.LinkMan;
import czm.hibernate.utils.HibernateUtils;
public class TestDemo {
@Test
/**
* 投影查询
*/
public void testdemo6() {
Session session = HibernateUtils.getCurrentSession();
Transaction tx = session.beginTransaction();
// 投影查询
// 单个属性
List<Object> list = session.createQuery("select cust_name from Customer").list();
for (Object object :list) {
System.out.println(object); }
tx.commit();
}
}
程序运行结果 :
多个属性查询
package czm.hibernate.testdemo;
import java.util.Arrays;
import java.util.List;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.junit.Test;
import czm.hibernate.domain.Customer;
import czm.hibernate.domain.LinkMan;
import czm.hibernate.utils.HibernateUtils;
public class TestDemo {
@Test
/**
* 投影查询
*/
public void testdemo6() {
Session session = HibernateUtils.getCurrentSession();
Transaction tx = session.beginTransaction();
// 投影查询
// 多个属性:
List<Object[]> list = session.createQuery("select cust_name,cust_source from Customer").list();
for(Object[] objects : list) {
System.out.println(Arrays.toString(objects)); }
tx.commit();
}
}
程序运行结果 :
多个属性封装成对象
首先在实体类Customer 中添加一个无参构造和一个有参构造方法,根据需要查询的属性个数决定有参构造方法中参数的个数
//无参构造
public Customer() {
super();
// TODO Auto-generated constructor stub
}
//含两个参数的构造方法
public Customer(String cust_name, String cust_source) {
super();
this.cust_name = cust_name;
this.cust_source = cust_source;
}
编写查询 cust_name 和 cust_source 两个属性并将数据封装成对象的程序
package czm.hibernate.testdemo;
import java.util.Arrays;
import java.util.List;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.junit.Test;
import czm.hibernate.domain.Customer;
import czm.hibernate.domain.LinkMan;
import czm.hibernate.utils.HibernateUtils;
public class TestDemo {
@Test
/**
* 投影查询
*/
public void testdemo6() {
Session session = HibernateUtils.getCurrentSession();
Transaction tx = session.beginTransaction();
// 投影查询
// 查询多个属性,封装到对象中。
List<Customer> list = session.createQuery("select new Customer(cust_name,cust_source) from Customer").list();
for (Customer customer : list) {
System.out.println(customer);
}
tx.commit();
}
}
程序运行结果 :
(5)、HQL的分页查询
首先在实体类LinkMan中添加 toString方法 ,添加toString方法时去掉 customer对象属性,否则会造成死循环
@Override
public String toString() {
return "LinkMan [lkm_id=" + lkm_id + ", lkm_name=" + lkm_name + ", lkm_gender=" + lkm_gender + ", lkm_phone="
+ lkm_phone + ", lkm_mobile=" + lkm_mobile + ", lkm_email=" + lkm_email + ", lkm_qq=" + lkm_qq
+ ", lkm_position=" + lkm_position + ", lkm_memo=" + lkm_memo + "]";
}
编写分页查询程序
package czm.hibernate.testdemo;
import java.util.Arrays;
import java.util.List;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.junit.Test;
import czm.hibernate.domain.Customer;
import czm.hibernate.domain.LinkMan;
import czm.hibernate.utils.HibernateUtils;
public class TestDemo {
@Test
/**
* 分页查询
*/
public void testdemo7() {
Session session = HibernateUtils.getCurrentSession();
Transaction tx = session.beginTransaction();
// 分页查询
Query query = session.createQuery("from LinkMan");
//每页显示10条数据
query.setFirstResult(0);
query.setMaxResults(10);
List<LinkMan> list = query.list();
for (LinkMan linkMan : list) {
System.out.println(linkMan);
}
tx.commit();
}
}
程序运行结果 :
(6)、HQL的分组统计查询
package czm.hibernate.testdemo;
import java.util.Arrays;
import java.util.List;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.junit.Test;
import czm.hibernate.domain.Customer;
import czm.hibernate.domain.LinkMan;
import czm.hibernate.utils.HibernateUtils;
public class TestDemo {
@Test
/**
* 分组统计查询
*/
public void testdemo8() {
Session session = HibernateUtils.getCurrentSession();
Transaction tx = session.beginTransaction();
// 聚合函数的使用:count(),max(),min(),avg(),sum()
/*Object object = session.createQuery("select count(*) from Customer").uniqueResult();
System.out.println(object);*/
// 分组统计:
List<Object[]> list = session.createQuery("select cust_source,count(*) from Customer group by cust_source").list();
for (Object[] objects : list) {
System.out.println(Arrays.toString(objects));
}
tx.commit();
}
}
程序运行结果 :
(7)、HQL的多表查询
内连接 :将数据封装成Object数组
package testdemo02;
import java.util.Arrays;
import java.util.List;
import org.hibernate.Criteria;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.hibernate.criterion.DetachedCriteria;
import org.hibernate.criterion.Projections;
import org.hibernate.criterion.Restrictions;
import org.junit.Test;
import czm.hibernate.domain.Customer;
import czm.hibernate.utils.HibernateUtils;
public class TestDemo02 {
@Test
/**
* HQL的多表查询
*/
public void testdemo9() {
Session session = HibernateUtils.getCurrentSession();
Transaction tx = session.beginTransaction();
// SQL内连接语句:SELECT * FROM cst_customer c INNER JOIN cst_linkman l ON c.cust_id = l.lkm_cust_id;
// HQL内连接语句:from Customer c inner join c.linkMans //其中 c 为 自定义实体类Customer的别名
List<Object[]> list = session.createQuery("from Customer c inner join c.linkMans").list();
for (Object[] objects : list) {
System.out.println(Arrays.toString(objects));
}
tx.commit();
}
}
程序运行结果 :
迫切内连接 :将数据封装到对象中
在实体类Customer 添加toString方法 ,此查询方法需要把类中的LinkMan对象属性勾选上,其它查询方法在添加toString方法时均不勾选此属性
@Override
public String toString() {
return "Customer [cust_id=" + cust_id + ", cust_name=" + cust_name + ", cust_source=" + cust_source
+ ", cust_industry=" + cust_industry + ", cust_level=" + cust_level + ", cust_phone=" + cust_phone
+ ", cust_mobile=" + cust_mobile + ", linkMans=" + linkMans + "]";
}
编写测试类
package testdemo02;
import java.util.Arrays;
import java.util.List;
import org.hibernate.Criteria;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.hibernate.criterion.DetachedCriteria;
import org.hibernate.criterion.Projections;
import org.hibernate.criterion.Restrictions;
import org.junit.Test;
import czm.hibernate.domain.Customer;
import czm.hibernate.utils.HibernateUtils;
public class TestDemo02 {
@Test
/**
* HQL的多表查询
*/
public void testdemo9() {
Session session = HibernateUtils.getCurrentSession();
Transaction tx = session.beginTransaction();
// HQL:迫切内连接 其实就在普通的内连接inner join后添加一个关键字fetch. from Customer c inner join fetch c.linkMans
List<Customer> list = session.createQuery("select distinct c from Customer c inner join fetch c.linkMans").list(); //通知hibernate,将另一个对象的数据封装到该对象中
for (Customer customer : list) {
System.out.println(customer);
}
tx.commit();
}
}
程序运行结果 :
Hibernate的查询方式四:QBC检索(重点)
QBC查询:Query By Criteria,条件查询。是一种更加面向对象化的查询的方式。
利用QBC可做7种查询 :
1、简单查询 2、排序查询 3、分页查询 4 、条件查询 5 、统计查询 6 、离线条件查询
(1)、QBC的简单查询
package testdemo02;
import java.util.List;
import org.hibernate.Criteria;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.junit.Test;
import czm.hibernate.domain.Customer;
import czm.hibernate.utils.HibernateUtils;
public class TestDemo02 {
@Test
/**
* 简单的查询
*/
public void testdemo1(){
Session session = HibernateUtils.getCurrentSession();
Transaction tx = session.beginTransaction();
// 获得Criteria的对象
Criteria criteria = session.createCriteria(Customer.class);
List<Customer> list = criteria.list();
for (Customer customer : list) {
System.out.println(customer);
}
tx.commit();
}
}
程序运行结果 :
(2)、QBC的排序查询
package testdemo02;
import java.util.List;
import org.hibernate.Criteria;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.hibernate.criterion.Order;
import org.junit.Test;
import czm.hibernate.domain.Customer;
import czm.hibernate.utils.HibernateUtils;
public class TestDemo02 {
@Test
/**
* 排序查询
*/
public void testdemo2(){
Session session = HibernateUtils.getCurrentSession();
Transaction tx = session.beginTransaction();
// 排序查询
Criteria criteria = session.createCriteria(Customer.class);
//criteria.addOrder(Order.asc("cust_id")); // 升序
criteria.addOrder(Order.desc("cust_id")); // 降序
List<Customer> list = criteria.list();
for (Customer customer : list) {
System.out.println(customer);
}
tx.commit();
}
}
程序运行结果 :
(3)、QBC的分页查询
package testdemo02;
import java.util.List;
import org.hibernate.Criteria;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.junit.Test;
import czm.hibernate.domain.LinkMan;
import czm.hibernate.utils.HibernateUtils;
public class TestDemo02 {
@Test
/**
* 分页查询
*/
public void testdemo3(){
Session session = HibernateUtils.getCurrentSession();
Transaction tx = session.beginTransaction();
// 分页查询
Criteria criteria = session.createCriteria(LinkMan.class);
//每页显示10条数据
criteria.setFirstResult(0);
criteria.setMaxResults(10);
List<LinkMan> list = criteria.list();
for (LinkMan linkMan : list) {
System.out.println(linkMan);
}
tx.commit();
}
}
程序运行结果 :
(4)、QBC的条件查询
package testdemo02;
import java.util.List;
import org.hibernate.Criteria;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.hibernate.criterion.Restrictions;
import org.junit.Test;
import czm.hibernate.domain.Customer;
import czm.hibernate.utils.HibernateUtils;
public class TestDemo02 {
@Test
/**
* 条件查询
*/
public void testdemo4(){
Session session = HibernateUtils.getCurrentSession();
Transaction tx = session.beginTransaction();
// 条件查询
Criteria criteria = session.createCriteria(Customer.class);
// 设置条件:
/**
* = eq
* > gt
* >= ge
* < lt
* <= le
* <> ne 不等于
* like
* in
* and
* or
*/
criteria.add(Restrictions.eq("cust_source", "程序员"));
criteria.add(Restrictions.like("cust_name", "李%"));
List<Customer> list = criteria.list();
for (Customer customer : list) {
System.out.println(customer);
}
tx.commit();
}
}
程序运行结果 :
(5)、QBC的统计查询
package testdemo02;
import java.util.List;
import org.hibernate.Criteria;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.hibernate.criterion.Projections;
import org.hibernate.criterion.Restrictions;
import org.junit.Test;
import czm.hibernate.domain.Customer;
import czm.hibernate.utils.HibernateUtils;
public class TestDemo02 {
@Test
/**
* 统计查询
*/
public void testdemo5(){
Session session = HibernateUtils.getCurrentSession();
Transaction tx = session.beginTransaction();
Criteria criteria = session.createCriteria(Customer.class);
/**
* add :普通的条件。where后面条件
* addOrder :排序
* setProjection :聚合函数 和 group by 、 having
*/
criteria.setProjection(Projections.rowCount());
Long num = (Long) criteria.uniqueResult();
System.out.println(num);
tx.commit();
}
}
程序运行结果 :
(6)、QBC的离线条件查询
package testdemo02;
import java.util.List;
import org.hibernate.Criteria;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.hibernate.criterion.DetachedCriteria;
import org.hibernate.criterion.Projections;
import org.hibernate.criterion.Restrictions;
import org.junit.Test;
import czm.hibernate.domain.Customer;
import czm.hibernate.utils.HibernateUtils;
public class TestDemo02 {
@Test
/**
* 离线条件查询
*/
public void testdemo6(){
//创建对象
DetachedCriteria detachedCriteria = DetachedCriteria.forClass(Customer.class);
detachedCriteria.add(Restrictions.like("cust_name", "李%"));
Session session = HibernateUtils.getCurrentSession();
Transaction tx = session.beginTransaction();
Criteria criteria = detachedCriteria.getExecutableCriteria(session);
List<Customer> list = criteria.list();
for (Customer customer : list) {
System.out.println(customer);
}
tx.commit();
}
}
程序运行结果 :
Hibernate的查询方式五:SQL检索
SQL查询:通过使用sql语句进行查询
查询结果数据封装成Object数组 :
package testdemo02;
import java.util.Arrays;
import java.util.List;
import org.hibernate.Criteria;
import org.hibernate.SQLQuery;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.hibernate.criterion.DetachedCriteria;
import org.hibernate.criterion.Projections;
import org.hibernate.criterion.Restrictions;
import org.junit.Test;
import czm.hibernate.domain.Customer;
import czm.hibernate.utils.HibernateUtils;
public class TestDemo02 {
@Test
public void demo1(){
Session session = HibernateUtils.getCurrentSession();
Transaction tx = session.beginTransaction();
//查询结果数据封装成Object数组
/*SQLQuery sqlQuery = session.createSQLQuery("select * from cst_customer");
List<Object[]> list = sqlQuery.list();
for (Object[] objects : list) {
System.out.println(Arrays.toString(objects));
}*/
//查询结果数据封装成对象
SQLQuery sqlQuery = session.createSQLQuery("select * from cst_customer");
sqlQuery.addEntity(Customer.class);
List<Customer> list = sqlQuery.list();
for (Customer customer : list) {
System.out.println(customer);
}
tx.commit();
}
}
程序运行结果 :
查询结果数据封装成对象 :
package testdemo02;
import java.util.Arrays;
import java.util.List;
import org.hibernate.Criteria;
import org.hibernate.SQLQuery;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.hibernate.criterion.DetachedCriteria;
import org.hibernate.criterion.Projections;
import org.hibernate.criterion.Restrictions;
import org.junit.Test;
import czm.hibernate.domain.Customer;
import czm.hibernate.utils.HibernateUtils;
public class TestDemo02 {
@Test
public void demo1(){
Session session = HibernateUtils.getCurrentSession();
Transaction tx = session.beginTransaction();
//查询结果数据封装成Object数组
/*SQLQuery sqlQuery = session.createSQLQuery("select * from cst_customer");
List<Object[]> list = sqlQuery.list();
for (Object[] objects : list) {
System.out.println(Arrays.toString(objects));
}*/
//查询结果数据封装成对象
SQLQuery sqlQuery = session.createSQLQuery("select * from cst_customer");
sqlQuery.addEntity(Customer.class);
List<Customer> list = sqlQuery.list();
for (Customer customer : list) {
System.out.println(customer);
}
tx.commit();
}
}
程序运行结果 :