package test;
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.Order;
import org.hibernate.criterion.Projections;
import org.hibernate.criterion.Restrictions;
import org.junit.Test;
import domain.Linkman;
import utils.HibernateUtils;
/**
* hibernate 中 QBC与SQL的演示
*/
public class Demo2 {
/*
* hibernate 使用 SQL 来查询
*
*/
@Test
public void testRun7() {
//service层获得session
Session session = HibernateUtils.getCurrentSession();
Transaction tr = session.beginTransaction();
//获得SQLQuery对象
String sql = "select * from cst_linkman where lkm_id>?";
SQLQuery sqlQuery = session.createSQLQuery(sql);
//第一个参数0 对应第一个问号,第二个参数是值
sqlQuery.setParameter(0, 1L);
//不要忘记添加实体类
sqlQuery.addEntity(Linkman.class);
List<Linkman> list = sqlQuery.list();
for (Linkman linkman : list) {
System.out.println(linkman);
}
tr.commit();
}
/*
* 离线条件查询使用的是DetachedCriteria接口进行查询,离线条件查询对象在创建的时候,
* 不需要使用Session对象,只是在查询的时候使用Session对象即可。
*/
@Test
public void testRun6() {
//模拟从前台传来的离线criteria
DetachedCriteria criteria = DetachedCriteria.forClass(Linkman.class);
//service层获得session
Session session = HibernateUtils.getCurrentSession();
Transaction tr = session.beginTransaction();
//添加条件
criteria.add(Restrictions.like("lkm_name", "%联系人%"));
//关键一步,用DetachedCriteria的getExecutableCriteria传入当前session执行后面的操作
List<Linkman> list = criteria.getExecutableCriteria(session).list();
System.out.println(list.size());
for (Linkman linkman : list) {
System.out.println(linkman);
}
tr.commit();
}
/*
* 聚合查询,使用hibernate的工具类Projections来操作
*/
@Test
public void testRun5() {
Session session = HibernateUtils.getCurrentSession();
Transaction tr = session.beginTransaction();
//获得criteria对象
Criteria criteria = session.createCriteria(Linkman.class);
//设置条件
criteria.setProjection(Projections.rowCount());//行数查询
List<Number> list = criteria.list();
System.out.println(list.get(0).longValue());
tr.commit();
}
/*
* 条件查询(Criterion是查询条件的接口,Restrictions类是Hibernate框架提供的工具类,使用该工具类来设置查询条件)
* 条件查询使用Criteria接口的add方法,用来传入条件。
* 使用Restrictions的添加条件的方法,来添加条件,例如:
* Restrictions.eq -- 相等
* Restrictions.gt -- 大于号
* Restrictions.ge -- 大于等于
* Restrictions.lt -- 小于
* Restrictions.le -- 小于等于
* Restrictions.between -- 在之间
* Restrictions.like -- 模糊查询
* Restrictions.in -- 范围
* Restrictions.and -- 并且
* Restrictions.or -- 或者
*
*/
@Test
public void testRun4() {
Session session = HibernateUtils.getCurrentSession();
Transaction tr = session.beginTransaction();
//获得criteria对象
Criteria criteria = session.createCriteria(Linkman.class);
// //设置条件
// criteria.add(Restrictions.isNotNull("lkm_email"));//判断某个字段不为空
criteria.add(Restrictions.eq("lkm_gender", "男"));
criteria.add(Restrictions.gt("lkm_id", 1L));
//获得列表
List<Linkman> list = criteria.list();
System.out.println("___________________________");
for (Linkman linkman : list) {
System.out.println(linkman);
}
tr.commit();
}
/*
* 分页排序查询方法
*/
@Test
public void testRun3() {
Session session = HibernateUtils.getCurrentSession();
Transaction tr = session.beginTransaction();
//获得criteria对象
Criteria criteria = session.createCriteria(Linkman.class);
//设置条件
// criteria.addOrder(Order.asc("lkm_id"));
criteria.addOrder(Order.desc("lkm_id"));
//设置分页参数
criteria.setFirstResult(0);//设置起始index
criteria.setMaxResults(3);//设置获取数据长度
//获得列表
List<Linkman> list = criteria.list();
for (Linkman linkman : list) {
System.out.println(linkman);
}
tr.commit();
}
/*
* 排序查询方法
*/
@Test
public void testRun2() {
Session session = HibernateUtils.getCurrentSession();
Transaction tr = session.beginTransaction();
//获得criteria对象
Criteria criteria = session.createCriteria(Linkman.class);
//设置条件
// criteria.addOrder(Order.asc("lkm_id"));
criteria.addOrder(Order.desc("lkm_id"));
//获得列表
List<Linkman> list = criteria.list();
for (Linkman linkman : list) {
System.out.println(linkman);
}
tr.commit();
}
/*
* 基本查询方法
*/
@Test
public void testRun1() {
Session session = HibernateUtils.getCurrentSession();
Transaction tr = session.beginTransaction();
List<Linkman> list = session.createCriteria(Linkman.class).list();
for (Linkman linkman : list) {
System.out.println(linkman);
}
tr.commit();
}
}