hibernate-检索方式

来源:互联网 发布:海康威视无网络视频 编辑:程序博客网 时间:2024/05/22 00:53

session对象

添加数据

session.save(Object o);

修改数据

修改数据有两种方式

//第一种方式Customer customer = new Customer();customer.setId(2);customer.setName("小明");session.update(customer);//第二种方式,先查询再修改Customer customer = (Customer) session.get(Customer.class, 1);customer.setName("小刚");session.update(customer);

不推荐第一种方式,因为如果有的属性没有设置值,会将这个属性的默认值存入。

删除记录

有两种方式

//第一种方式Customer customer = new Customer();customer.setId(2);session.delete(customer);//第二种方式,先查询再删除Customer customer = (Customer)session.get(Customer.class, 1);session.delete(customer);

在级联删除的时候只能用第二种。

根据ID查询

Customer c=(Customer)session.get(Customer.class,1);Customer c=(Customer)session.load(Customer.class,1);

使用get方法,如果指定的记录不存在,则返回null;而使用load方法,如果指定记录不存在,则会报出ObjectNotFoundException异常。

发送SQL语句的时间不同。load采用了一个延迟加载的技术(懒加载),真正使用这个对象数据(不包括id)的时候才发送。get方法是立即检索,执行get方法就马上发送。

load返回的是代理对象,get返回的是真实对象

导航对象图检索方式

导航对象图检索方式是根据已经加载的对象,导航到其他对象。它利用类与类之间的关系来检索对象。

Order order=(Order)session.get(Order.class,1);Customer customer=order.getCustomer();

SQL检索方式

List<Object[]> list=session.createSQLQuery("select * from customer").list();//封装到对象中List<Customer> list=session.createSQLQuery("select * from customer").addEntity(Customer.class).list();

HQL

HQL(Hibernate Query Language)使用的是类、对象和属性的概念,没有表和字段的概念。
完整的HQL语句如下

[select/update/delete...][from...][where...][group by...][having...][order by...][asc/desc]

当检索数据表中的所有字段时,查询语句中可以省略select关键字。

Query接口是专门的HQL查询接口,Customer是类名,不是表名,区分大小写

Query query=session.createQuery("from Customer");List<Customer> list=query.list();

条件查询

1.按参数位置查询

Query query=session.createQuery("from Customer where name like ?");query.setString(0,"jo%");//或者直接写成query.setParameter(0,"jo%");List<Customer> cs=query.list();

2.按参数名字查询

Query query=session.createQuery("from Customer where name=:name");query.setParameter("name","LiMing");List<Customer> cs=query.list();

:name定义了名称参数

3.参数为对象

Customer customer=new Customer();customer.setCid(1);List<Order> list=session.createQuery("from Order o where o.customer=?")                    .setEntity(0,customer).list();

使用别名

使用别名,as可以省略

String hql="from Customer as c where c.name='Jack'";

不支持select * from Customer写法.可以写成select c from Customer as c

排序

List<Customer> list=session.createQuery("from Customer c order by c.id desc").list();

desc是按降序排,asc是正序排

投影操作,查询对象的某几个属性

//查询客户的名称List<Object> list=session.createQuery("select c.cname from Customer c").list();//查询名称和idList<Object[]> list=session.createQuery("select c.id,c.cname from Customer c").list();

动态实例查询

动态实例查询,在投影查询时,返回的查询对象是一个对象数组,而且还用处理顺序,操作起来非常不方便。为了方便操作,可以把返回结果从新组成一个实体的实例。

String hql="select new Customer(c.name,c.age) from Customer as c";List<Customer> cs=session.createQuery(hql).list();

select语句后面不再是属性,而是一个实体类对象,查询语句会把查询到的name和age封装到Customer对象中作为返回结果。使用此种方式查询时,实体类Customer中要添加响应的构造方法,所添加的构造方法代码如下

//无参构造public Customer(){}//包含name和age参数的构造public Customer(String name,Integer age){  this.name=name;  this.age=age;}

由于需要查询的是name和age,所以需要添加带有name和age参数的构造方法,又由于添加此构造方法后,虚拟机将不再默认提供无参的构造方法,所以需要再添加一个无参的构造方法。

分页查询

Query query=session.createQuery("from Order");query.setFirstResult(0);//从第几条开始查query.setMaxResults(10);//查询几条List<Order> list=query.list();

获取单个对象

Customer customer=(Customer)session.createQuery("from Customer where cname=?")                    .setString(0,"小明").uniqueResult();

多表查询

内连接

List<Object[]> list=session.createQuery("from Customer c inner join c.orders").list();

迫切内连接,需要加一个fetch关键字

List<Customer> list=session.createQuery("from Customer c inner join fetch c.orders").list();

迫切内连接返回的是一个Customer对象

但会有很多重复的数据,需要distinct

List<Customer> list=session.createQuery("select distinct c from Customer c inner join fetch c.orders").list();

聚合查询

Long count=(Long)session.createQuery("select count(*) from Order").uniqueResult();

QBC

QBC(Query By Criteria)是Hibernate提供的另一种检索对象的方式。组合查询的时候可以用

//创建Criteria对象Criteria criteria=session.createCriteria(Customer.class);//设定查询条件Criterion criterion=Restrictions.eq("id",a);//添加查询条件criteria.add(criterion);//执行查询,返回查询结果List<Customer> cs=criteria.list();

如果不添加查询条件,查询的是所有数据