hibernate-检索方式

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();

//查询名称和id
List<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();

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 15
    评论
评论 15
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值