Hibernate中的查询

温故而知新,本文回顾一下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,主键值)

区别:

扫描二维码关注公众号,回复: 9027575 查看本文章

       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的查询
    }

如有不足,欢迎指正留言。。。

发布了91 篇原创文章 · 获赞 1 · 访问量 3228

猜你喜欢

转载自blog.csdn.net/duan196_118/article/details/104124649