1.概述
对数据操作中,最常用的是select。使用Hibernate如何进行select操作。
分为五种:
1.导航对象图检索方式,根据已加载的对象导航到其他对象。
2.OID检索方式,按照对象的OID来检索对象。
3.HQL检索方式,使用面向对象的HQL查询语言。
4.QBC检索方式,使用QBC API来检索对象,这种API封装了基于字符串形式的查询语言,提供了更加面向对象的查询接口。
5.本地SQL检索方式,使用本地数据库的SQL查询语句。
2.导航对象图检索方式
Customer C = session.get(Customer.class,2)
C.getOrders().size()
通过在Hibernate中进行映射关系,在Hibernate操作时,可以通过导航方式得到其关联的持久化对象信息。
3.OID检索方式
Session.get(Custuomer.class,2);
Session.load(Order.class,1);
Hibernate中通过get、load方法查询指定对象,要通过OID查询。
4.HQL
HQL是我们在Hibernate中常用的一种检索方式。
完整的HQL语句形式如下:Select/Update/Delete---from---where---group by---having---order by---asc/desc.
基本步骤:
1.得到session,
2.编写HQL语句
3.通过session。createQuery(hql)创建一个Query对象
4.为Query对象设置条件参数。
5.执行list查询所有,它所反射的是List集合,uniqueResult()返回一个查询结果。
4.基本检索
@Test//基本检索
public void test2(){
Session session = hibernateUtils.openSession()
session.beginTransaction()
// 缩写HQL
String hql = "from Customer"
2.通过session.createQuery(hql)
// org.hibernate.Query query = session.createQuery(hql)
通过list方法得到数据
// java.util.List<Customer> list = query.list()
java.util.List<Customer> list = session.createQuery(hql).list()
System.out.println(list.get(0))
}
5.排序检索
@Test//排序检索
public void test3(){
// 查询订单,根据订单的价格进行排序
Session session = hibernateUtils.openSession()
session.beginTransaction()
// 1.定义hql
String hql = "from Orders order by money desc"
java.util.List<Orders> list = session.createQuery(hql).list()
System.out.println(list)
session.getTransaction().commit()
session.close()
}
6.条件检索
@Test//条件
public void test4(){
//
Session session = hibernateUtils.openSession()
session.beginTransaction()
// 1.根据位置来绑定参数
String hql = "from Orders where money>:mymoney"
// 执行hql
java.util.List<Orders> list = session.createQuery(hql).setParameter("mymoney", 40).list()
// 可以使用例如 SetString() SetDouble()这样的方法去田间参数,参数的序号从0开始
System.out.println(list)
session.getTransaction().commit()
session.close()
}
7.分页检索
@Test//分页
public void test5(){
//
Session session = hibernateUtils.openSession()
session.beginTransaction()
org.hibernate.Query query = session.createQuery("from Orders")
query.setFirstResult((2-1)*6)
query.setMaxResults(6)
java.util.List<Orders> list = query.list()
System.out.println(list)
session.getTransaction().commit()
session.close()
}
8.分组统计
@Test//分组统计
public void test6(){
//
Session session = hibernateUtils.openSession()
session.beginTransaction()
// 统计操作----统计一共有多少订单
String sql = "select count(*) from Orders "
Object count = session.createQuery(sql).uniqueResult()
System.out.println(count)
// 分组操作--每一个人的订单总价
String hql = "select sum(money) from Orders group by c"
java.util.List<Orders> list = session.createQuery(hql).list()
System.out.println(list)
session.getTransaction().commit()
session.close()
}
9.投影查询
关于部分属性查询,可以使用投影将部分属性封装到对象中。
@Test//投影查询
public void test7(){
//
Session session = hibernateUtils.openSession()
session.beginTransaction()
// 1查询所有Customer的Name
// String hql = "select name from Customer"
// java.util.List<Orders> list = session.createQuery(hql).list()
// System.out.println(list)
// 2查询所有的Customer的id,name
// 如果只查询一个列,得到的结果是List<Object>
// String hql = "select id,name from Customer"
// java.util.List<Object[]> list = session.createQuery(hql).list()
// System.out.println(list)
// for (Object[] objects:list) {
// for (Object object : objects) {
// System.out.println(object + "")
// }
// System.out.println()
// }
// 3.使用投影将查询的结果封装懂啊Customer对象中
String hql = "select new Customer(id,name) from Customer "
java.util.List<Customer> customers = session.createQuery(hql).list()
System.out.println(customers)
session.getTransaction().commit()
session.close()
}
10.命名查询
--可以将HQL语句先定义出来,在使用时通过session.getNamedQuery(QueryName),得到一个Query在执行。
--Q:hql定义在什么位置?
1.如果有hbm配置文件,那么在当前的hql操作是对哪一个实体进行操作,就在哪一个实体类中进行配置。
<query name="myHql">
from Customer
</query>
2.如果是使用注解来描述PO的配置,直接在PO类中使用
@Entity
@Table(name="t_customer")
@NamedQuery(name="myHql",query="from Customer")
@Test//命名查询
public void test8(){
//
Session session = hibernateUtils.openSession()
session.beginTransaction()
org.hibernate.Query query = session.getNamedQuery("myHql")
java.util.List<Customer> list = query.list()
System.out.println(list)
session.getTransaction().commit()
session.close()
}
@Test//命名查询2
public void test9(){
//
Session session = hibernateUtils.openSession()
session.beginTransaction()
// 1.要查询tommy这个客户的订单
Customer c = session.get(Customer.class, 1)
org.hibernate.Query query = session.getNamedQuery("findOrderByCustomer")
// 现在hql他的参数是一个实体
java.util.List<Orders> list = query.setEntity("c", c).list()
System.out.println(list)
session.getTransaction().commit()
session.close()
}
11.QBC
--它是一种更加面向对象的检索方式
QBC步骤:
1.Session得到一个Criteria对象,session.createCriteria()
2.设定条件 Criterion实例,他的获取可以通过Restrictions类提供静态。
Criteria的add方法用于添加查询条件。
3.调用list进行查询,Criteria.list。
11.1QBC基本检索
@Test//QBC基本检索
public void test1(){
// 查询所有的Customer
Session session = hibernateUtils.openSession()
session.beginTransaction()
// 得到一个Criteria对象
Criteria criteria = session.createCriteria(Customer.class)
// 2.调用list方法
List<Customer> list = criteria.list()
System.out.println(list)
session.getTransaction().commit()
session.close()
}
11.2QBC排序检索
@Test//QBC排序检索
public void test2(){
// 查询订单信息,根据订单的价格进行查询
Session session = hibernateUtils.openSession()
session.beginTransaction()
Criteria criteria = session.createCriteria(Orders.class)
// 制定排序
criteria.addOrder(org.hibernate.criterion.Order.desc("money"))
List<Orders> list = criteria.list()
System.out.println(list)
session.getTransaction().commit()
session.close()
}
11.3QBC条件检索
@Test//QBC排序检索
public void test3(){
// 查询订单信息,根据订单的价格进行查询
Session session = hibernateUtils.openSession()
session.beginTransaction()
// 查询名称叫tommy的客户
Criteria criteria = session.createCriteria(Customer.class)
Criterion like = Restrictions.like("name", "Tommy_")
criteria.add(like)
Customer customer = (Customer) criteria.uniqueResult()
System.out.println(customer)
// 查询订单价格在1050以上的,并且他的客户是tommy
Criteria criteria2 = session.createCriteria(Orders.class)
SimpleExpression lt = Restrictions.lt("money", 1050d)
SimpleExpression eq = Restrictions.eq("c", customer)
LogicalExpression and = Restrictions.and(lt,eq)
List<Orders> list = criteria2.list()
System.out.println(list)
session.getTransaction().commit()
session.close()
}
11.4QBC分页检索
@Test//分页检索
public void test5(){
// 查询订单信息,根据订单的价格进行查询
Session session = hibernateUtils.openSession()
session.beginTransaction()
Criteria criteria = session.createCriteria(Orders.class)
criteria.setFirstResult((2-1)*6)
criteria.setMaxResults(6)
List<Orders> list = criteria.list()
System.out.println(list)
session.getTransaction().commit()
session.close()
}
11.5QBC统计检索
@Test//统计检索
public void test6(){
// 查询订单信息,根据订单的价格进行查询
Session session = hibernateUtils.openSession()
session.beginTransaction()
// 1.统计订单总数
Criteria criteria = session.createCriteria(Orders.class)
Object obj = criteria.setProjection(Projections.rowCount()).uniqueResult()
System.out.println(obj)
// 2.订单的总价格---分组统计根据客户
criteria.setProjection(Projections.projectionList().add(Projections.sum("money")).add(Projections.groupProperty("c")))
List<Object[]> list = criteria.list()
for (Object[] object : list) {
for (Object object2 : object) {
System.out.println(object2)
}
}
session.getTransaction().commit()
session.close()
}
11.6 QBC离线的条件检索
@Test//离线检索
public void test7(){
// 1.得到一个DetaChedCriteria
DetachedCriteria detachedCriteria = DetachedCriteria.forClass(Customer.class)
detachedCriteria.add(Restrictions.like("name", "Tommy_"))
// 2.生成Criteria的执行操作
Session session = hibernateUtils.openSession()
session.beginTransaction()
Criteria criteria = detachedCriteria.getExecutableCriteria(session)
List<Customer> list = criteria.list()
System.out.println(list)
session.getTransaction().commit()
session.close()
}
11.7 QBC 本地SQL
@Test//本地SQL
public void test8(){
Session session = hibernateUtils.openSession()
session.beginTransaction()
// 1.执行本地sql
SQLQuery sqlQuery = session.createSQLQuery("select * from t_customer")
sqlQuery.addEntity(Customer.class)
List list = sqlQuery.list()
System.out.println(list)
session.getTransaction().commit()
session.close()
}
11.8 QBC 本地SQL
可以见sQl语句定义在hbm文件中,也可以使用注解。
<sql-query name=""></sql-query>
本地命名sql注解定义
@NamedNativeQuery(name="findCustomer",query="select * from t_customer")
如果在执行这个命令的sql会产生异常。
Query query = session.getNamedQuery("findCustomer");
List list2 = query.list();
System.out.println(list);
出现问题的原因是:Hibernate不知道执行“select * from customer”后怎么对结果进行封装
在po类中,Customer
@sqlResultSetMapping(name="customerSetMapping",entitied = {@EntityResult(entityClass = Customer.class,fields = {@FieldResult(name="id",column="id"),@FieldResult(name="name",column="name")})})
@NamedNativeQuery(name="findCustomer",query="select * from t_customer",resultSetMapping="customerSetMapping")