Hibernate检索方式(补充)
*
ps :
一 : 导航对象图检索方式
Customer c=session.get(Customer.class,2);c.getOrders().size();
- 通过在hibernate中进行映射关系,在hibernate操作时,可以通过导航方式得到其关联的持久化对象信息。
二 : OID检索方式
session.get(Customer.class,3);session.load(Order.class,1);
- Hibernate中通过get/load方法查询指定的对象,要通过OID来查询。
三 : QBC
- QBC
(query by criteria)
,它是一种更加面向对象的检索方式。 - QBC步骤:
- 通过Session得到一个Criteria对象:
session.createCriteria()
- 设定条件:Criterion实例,它的获取可以通过
Restrictions
类提供静态。Criteria
的add
方法用于添加查询条件
- 调用list进行查询:
criterfia.list()
- 通过Session得到一个Criteria对象:
(一) 基本检索
//基本检索@Test
public void test1(){
//查询所有的Customer
Session session=HibernateUtils.openSession();
session.beginTransaction();
//1.得到一个Criteria对象
Criteria criteria=session.createCriteria(Customer.class);
//2.调用list方法
List<Customer> list = criteria.list();
System.out.println(list);
session.getTransaction().commit();
session.close();
}
(二) 排序检索
//排序查询@Test
public void test2(){
// 查询订单信息 根据订单的价格进行排序
Session session = HibernateUtils.openSession();
session.beginTransaction();
Criteria criteria=session.createCriteria(Order.class);
//指定排序
//criteria.addOrder(org.hibernate.criterion.Order.desc("money"));//降序
criteria.addOrder(org.hibernate.criterion.Order.asc("money"));//降序
List<Order> list = criteria.list();
System.out.println(list);
session.getTransaction().commit();
session.close();
}
- 注意在
criteria.addOrder()
方法的参数使用的Order
是hibernate
中的对象
(三) 条件检索(重点掌握,其他框架都能写)
- Restrictions:限制,约束。用于添加静态条件
and()
:添加多个静态条件gt()
:>lt()
:<ge()
:>=le()
:<=eq()
:==
//条件检索@Test
public void test3(){
Session session = HibernateUtils.openSession();
session.beginTransaction();
//1. 查询名称叫张某的客户:张_
Criteria criteria=session.createCriteria(Customer.class);
Criterion like=Restrictions.like("name","张_");//其他条件lt
criteria.add(like);//添加条件
Customer c=(Customer) criteria.uniqueResult();
System.out.println(c);
//2.查询订单价格在1050以上的,并且它的客户是张某
Criteria cri=session.createCriteria(Order.class);
SimpleExpression gt = Restrictions.gt("money",1005d);
SimpleExpression eq = Restrictions.eq("c", c);
LogicalExpression and = Restrictions.and(gt,eq);
cri.add(and);
//List orders = cri.add(Restrictions.and(Restrictions.gt("money", 1050d),Restrictions.eq("c", c))).list();
List<Customer> list = cri.list();
System.out.println(list);
session.getTransaction().commit();
session.close();
}
(四) 分页检索
// 分页检索@Test
public void test4() {
Session session = HibernateUtils.openSession();
session.beginTransaction();
Criteria criteria = session.createCriteria(Order.class);
criteria.setFirstResult((2 - 1) * 6);
criteria.setMaxResults(6);
List<Order> list = criteria.list();
System.out.println(list);
session.getTransaction().commit();
session.close();
}
(五) 统计分组检索(很重要,非常规操作的时候用)
count
sum
avg
max
min
//统计检索@Test
public void test5(){
Session session = HibernateUtils.openSession();
session.beginTransaction();
Criteria criteria=session.createCriteria(Order.class);
//Object obj = criteria.setProjection(Projections.rowCount()).uniqueResult();//统计总行数 count(*)
//System.out.println(obj);
//2.订单的总价格---分组统计客户
//Object obj = criteria.setProjection(Projections.sum("money")).uniqueResult();//统计总金额
//System.out.println(obj);
//3.按客户分组显示客户订单总金额
criteria.setProjection(Projections.projectionList().add(Projections.sum("money")).add(Projections.groupProperty("c")));
List<Object[]> list = criteria.list();
System.out.println(list);
for (Object[] objects : list) {
for (Object obj : objects) {
System.out.println(obj);
}
}
session.getTransaction().commit();
session.close();
}
(六) 离线条件检索
- 离线:条件是在web层封装好后传递到dao层的,并不是直接得到检索条件
DetachedCriteria
//离线条件检索@Test
public void test6(){
//1.得到一个DetachedCriteria
DetachedCriteria dc=DetachedCriteria.forClass(Customer.class);
dc.add(Restrictions.like("name", "张_"));
//2.生成Criteria执行操作
Session session = HibernateUtils.openSession();
session.beginTransaction();
Criteria criteria = dc.getExecutableCriteria(session);
List<Customer> list = criteria.list();
System.out.println(list);
session.getTransaction().commit();
session.close();
}
四 : 本地SQL
(一) 单表操作
// 测试执行本地sql@Test
public void test1() {
Session session = HibernateUtils.openSession();
session.beginTransaction();
SQLQuery sqlQuery = session.createSQLQuery("select * from t_customer");
// List<Object[]> list = sqlQuery.list();
sqlQuery.addEntity(Customer.class);
List list = sqlQuery.list();
System.out.println(list);
session.getTransaction().commit();
session.close();
}
- 本地sql也支持命名查询。
- 可以将sql语句定义在hbm文件中,也可以使用注解。
<sql-query name=""> select * from t_customer
</sql-query>
- 本地命名sql注解定义
@NamedNativeQuery(name="findCustomer",query="select * from t_customer")
- 如果执行这个命名的sql会产生异常
// 测试本地sql命名查询@Test
public void test2() {
Session session = HibernateUtils.openSession();
session.beginTransaction();
Query query = session.getNamedQuery("findCustomer");
List list = query.list();
System.out.println(list);
session.getTransaction().commit();
session.close();
}
ExceptionInInitializerError * 初始化错误
Pure native scalar queries are not yet suppored
* 本地语句不支持
- 出现问题的原因:是hibernate不知道执行select * from t_customer后如何将结果封装。
@SqlResultSetMapping( name="customerSetMapping",
entities={
@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"
)
(二) 多表操作
1.内连接 INNER JOIN ON
SELECT *
FROM
t_customer AS c
INNER JOIN t_order AS o ON c.id = o.c_customer_id;
- 使用内连接它只能将有关联的数据得到。
2.隐式内连接
- 使用"逗号"将表分开,使用WHERE来消除迪卡尔积
SELECT *
FROM
t_customer AS c,
t_order o
WHERE
c.id = o.c_customer_id;
3.外连接
- 左外
LEFT OUTER JOIN
- 右外
RIGHT OUTER JOIN
OUTER
可以省略
SELECT *
FROM
t_customer c
LEFT OUTER JOIN t_order o ON c.id = o.c_customer_id;
以上是 Hibernate检索方式(补充) 的全部内容, 来源链接: utcz.com/z/511322.html