Hibernate中的查询
程序员文章站
2022-06-20 10:44:00
...
温故而知新,本文回顾一下Hibernate中的查询方式。
1.hql查询
//第一种:查询所有
Session session = HibernateUtils.getCurrentSession();
Transaction ts = session.beginTransaction();
String hql="from Customer";
Query query = session.createQuery(hql);
List list = query.list();
System.out.println(list);
//第二种:查询单条数据
Session session = HibernateUtils.getCurrentSession();
Transaction ts = session.beginTransaction();
//?占位符
String hql="from Customer where custId=?";//根据实体的属性来查询
Query query = session.createQuery(hql);
query.setParameter(1);//传入的值的类型与数据库定义的类型相符合
Customer customer = (Customer)query.uniqueResult();
//此处也可以用list来接收,具体根据业务需求来确定
//命名占位符
String hql2="from Customer where custId=:cust_id and custName =:cust_name";
Query query=session.createQuery();
query.setParameter("cust_id",1L);
query.setParameter("cust_name","dsx");//和占位的名字保持一致
Customer c=(Customer)query.uniqueResult();
2. sql查询 (查询时编写的sql语句和数据库的sql语句一致)
Session session=HibernateUtils.getCurrentSession();//调用工具类获得session
Transaction t=session.beginTransaction();
//查询所有
SQLQuery query = session.createSQLQuery("select * from tb_customer");
//把查询到的对象封装到哪个实体
query.addEntity(Customer.class);
List list=query.list();
//分页
SQLQuery query = session.createSQLQuery("select * from tb limit ?,?");
query.setParameter(0, 2);
query.setParameter(1, 3);
query.addEntity(Customer.class);
List list=query.list();
//查询单值
SQLQuery query = session.createSQLQuery("select * from tb where id=?");
query.setParameter(0, 2L);
query.addEntity(Customer.class);
List list=query.uniqueResult();
3. Criteria查询:根据对象查
Criteria criteria = session.createCriteria(对象.class);
criteria.add(Restrictions.between("对象属性",值一,值二));
<!-- eq等于
ge大于等于
gt大于
le/lt 小于等于/小于
between... -->
//like 模糊查询
Criteria query = session.createCriteria(Customer.class);
if(name!=null && !name.trim().equals("")) {
query.add(Restrictions.like("custName", "%"+name+"%"));
}
//分页
criteria.setFirstResult();
criteria.setMaxResult();
List list=criteria.list();
//查询总记录数
Criteria c=criteria.setProjection(Projections.rowCount());
Object o=c.uniqueResult();
//排序
criteria.addOrder(asc/desc);
//c.setProjection(Projections.XXX());设置查询聚合函数
4. 离线查询:
DetachedCriteria 离线查询对象,不需要使用Session就可以拼凑查询条件。一般使用在web层或service层拼凑。将此对象传递给dao层,此时将与session进行绑定执行查询。
5. OID查询(基于唯一标识属性[主键]来查询)
使用方法:session.get(持久类.class,主键值)或session.load(持久类.class,主键值)
区别:
get:立即索检,get方法一执行,立即查询所有的字段的数据。检索不到的话会返回null
load:延迟加载,默认情况,load方法执行后,如果只使用OID的值不进行查询,如果要使用其他属性值才查询。
load方式检索不到的话会抛出org.hibernate.ObjectNotFoundException异常
public void test1() {
Configuration cfg = new Configuration().configure();
SessionFactory factory = cfg.buildSessionFactory();
Session session = factory.openSession();
Person p1 = session.get(Employee.class, 1L);//因为我用的是Long,所以这里给个1L
Person p2 = session.load(Employee.class, 2L);//不会立即发生sql语句
System.out.println(p1);
System.out.println(p2);//这里才发送p2的查询
}
如有不足,欢迎指正留言。。。