欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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());设置查询聚合函数    

​

Hibernate中的查询

4. 离线查询:

DetachedCriteria 离线查询对象,不需要使用Session就可以拼凑查询条件。一般使用在web层或service层拼凑。将此对象传递给dao层,此时将与session进行绑定执行查询。

Hibernate中的查询

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

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

 

 

相关标签: 框架 Hibernate