hibernate提供的5种检索数据方式

一、五种检索数据方式

1、OID检索,即使用session.get或session.load通过类及指定id查询数据,如Customer c=(Customer)session.get("Customer.class",1);

2、导航检索,即A类中含有另一个B类对象,获得A类后便可导航得到B对象数据

3、HQL检索,即使用hql语言得到数据,如session.createQuery("from Customer");

4、QBC检索,即使用QBC(Query By Criteria)API查询数据,如session.createCriteria(Customer.class);

5、本地SQL检索,即使用数据库SQL语句查询,如session.createSQLQuery("select * from customer");

 

HQL检索举例:

1、常见查询,查询所有客户

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

2、也可以普通SQL语句查询,但是要指明查询字段

Query query=session.createQuery("select id,name from Customer");

query.list()返回的不是客户对象集合,而是List<Object[]>集合

3、查询id为1的客户,返回一个对象,可以使用query.uniqueResult();获取一个对象

Query query=session.createQuery("from Customer where id=1");Customer customer=(Customer)query.uniqueResult();

也可使用参数化方式传入查询条件值如hql语句为from Customer where id=? 则,传入参数query.setParameter(0,1);

如hql为from Customer where id=:id 则,传入参数query.setParameter("id",1);

4、多态查询可以返回检索类的子类数据,如果是PO类(含有hbm.xml映射文件的类)在from后面直接写类名,如果不是,则写类名全名(如java.lang.Object)

Query query=session.createQuery("from Customer");//检索出所有实体,如果有子类也会检索出

Query query=session.createQuery("from java.lang.Object");//检索出所有持久化对象

Query query=session.createQuery("from java.io.Serializable");//检索出所有实现Serializable接口的实例

query.list()就会把hibernate.cfg.xml中配置映射的所有相应类都取出来

 

本地SQL检索举例:(如果不用关联实体可以不做表和类映射)

1、普通SQL查询所有客户

SQLQuery sqlQuery=session.createSQLQuery("select * from customer");

List<Object[]> objsList=sqlQuery.list();

2、关联查询客户和订单

SQLQuery sqlQuery=session.createSQLQuery("select * from customer c left join orders o on c.id=o.cid");

List<Object[]> objsList=sqlQuery.list();

3、关联实体查询所有客户

SQLQuery sqlQuery=session.createSQLQuery("select * from customer");

List<Customer> customerList=sqlQuery.addEntity(Customer.class).list();

4、用表连接和关联实体方式查询客户张三所有订单

SQLQuery sqlQuery=session.createSQLQuery("select distinct o.* from customer c inner join orders o on c.id=o.cid where c.name=:name");

sqlQuery.setParameter("name","张三");

List<Order> orderList=sqlQuery.addEntity(Order.class).list();

 

补充:

1、投影查询

session.createQuery("select new Customer(id,name) from Customer").list();//需要有Customer(int id,String name)构造函数

session.createQuery("select new List(id,name) from Customer").list();//返回的是List集合套集合List<List<Object>>,如[[1,张三],[2,李四]]

session.createQuery("select new map(id,name) from Customer").list();

2、命名查询,在hbm.xml文件中配置HQL语句查询

如查询name为张三的客户

在hibernate-mapping节点下配置query,是在hibernate-mapping节点下,而不是class节点下

<query name="findCustomer">

<![CDATA[from Customer where name=?]]>

</query>

代码:Query query=session.getNamedQuery("findCustomer");query.setParameter(0,"张三");List list=query.list();

转载于:https://my.oschina.net/u/2310745/blog/813393

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值