一、五种检索数据方式

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

hibernate提供的5种检索数据方式的更多相关文章

  1. Java基础知识强化之IO流笔记35:InputStreamReader(Reader字符流的子类)2种read数据方式

    1. InputStreamReader(Reader字符流的子类)2种read数据方式: InputStreamReader的read方法: int read():一次读取一个字符 int read ...

  2. Java基础知识强化之IO流笔记34:OutputStreamWriter(Writer字符流的子类)5种write数据方式

    1. OutputStreamWriter (转换流) OutputStreamWriter 是字符流通向字节流的桥梁:可使用指定的 charset 将要写入流中的字符编码成字节. 同时OutputS ...

  3. JNDI提供了一种统一的方式,可以用在网络上查找和访问服务

    JNDI提供了一种统一的方式,可以用在网络上查找和访问服务.通过指定一个资源名称,该名称对应于数据库或命名服务中的一个记录,同时返回数据库连接建立所必须的信息. JNDI主要有两部分组成:应用程序编程 ...

  4. android开发中的5种存储数据方式

    数据存储在开发中是使用最频繁的,根据不同的情况选择不同的存储数据方式对于提高开发效率很有帮助.下面笔者在主要介绍Android平台中实现数据存储的5种方式. 1.使用SharedPreferences ...

  5. MySQL提供的几种检索行数据的优化方式

    ICP(Index Condition Pushdown): 在MySQL5.6之前,存储引擎会通过遍历索引定位基表中 的行,然后返回给Server层,再去为这些数据进行WHERE后的条件过滤.MyS ...

  6. Dynamic CRM 2013学习笔记(十)客户端几种查询数据方式比较

    我们经常要在客户端进行数据查询,下面分别比较常用的几种查询方式:XMLHttpRequest, SDK.JQuery, SDK.Rest. XMLHttpRequest是最基本的调用方式,JQuery ...

  7. HTML 5 Web 存储提供了几种存储数据的方法

    localstorage存储对象分为两种: 1. sessionStorage: session即会话的意思,在这里的session是指用户浏览某个网站时,从进入网站到关闭网站这个时间段,sessio ...

  8. JavaScript 四种显示数据方式

    <!doctype html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  9. NUI四种提交数据方式c

    方式一: 1)前端页面 2)逻辑流参数设置 方式二: 1)前端页面 2)逻辑流参数设置 方式三:  1)前端页面 2)逻辑流参数设置 方式四: 1)前端页面 2)逻辑流参数设置

随机推荐

  1. 工作流模式与K2实现--(2)

      结构化过程  这两个模式的共同点在于:模式所涉及流程的执行路径是由运行时决定的,而非设计时确定.包括:Arbitrary cycles(强制循环模式) .Implicit termination( ...

  2. Android:30分钟弄明白Touch事件分发机制

    Touch事件分发中只有两个主角:ViewGroup和View.Activity的Touch事件事实上是调用它内部的ViewGroup的Touch事件,可以直接当成ViewGroup处理. View在 ...

  3. 修改Matlab 2012b默认工作路径

    MATLAB的路径有多种,这里只讲一下启动时设置成MATLAB的用户的默认工作路径. 本人不想去改MATLAB的原来系统文件,而是尽量利用startup.m.这个文件默认在'/home/r/文档/MA ...

  4. leetcode总结:permutations, permutations II, next permutation, permutation sequence

    Next Permutation: Implement next permutation, which rearranges numbers into the lexicographically ne ...

  5. Linux 基础入门(新版)”实验报告一~十二

    实验报告 日期: 2015年9月15日 一.实验的目的与要求 熟练地使用 Linux,本实验介绍 Linux 基本操作,shell 环境下的常用命令. 二.主要内容 1.Linux 基础入门& ...

  6. C#基础之枚举

    1.认识Enum 以前一直以为Enum是值类型,在VS中查看Enum的定义时才发现它是一个抽象的类.但是这个类很奇怪,Enum继承了ValueType这个很熟悉的值类型基类,它是唯一一个继承自Valu ...

  7. mui slider 改变默认index

    mui('class').slider().gotoItem(1,0) 目前已知问题,在class类名对应的dom元素是隐藏的时候初始化设置将报错,因为:  如果display取值是none,也就是不 ...

  8. 【MPI学习5】MPI并行程序设计模式:组通信MPI程序设计

    相关章节:第13章组通信MPI程序设计. MPI组通信与点到点通信的一个重要区别就是:组通信需要特定组内所有成员参与,而点对点通信只涉及到发送方和接收方. 由于需要组内所有成员参与,因此也是一种比较复 ...

  9. 【APUE】Chapter17 Advanced IPC & sign extension & 结构体内存对齐

    17.1 Introduction 这一章主要讲了UNIX Domain Sockets这样的进程间通讯方式,并列举了具体的几个例子. 17.2 UNIX Domain Sockets 这是一种特殊s ...

  10. 如何将Gate One嵌入我们的Web应用中

    参考文档http://liftoff.github.io/GateOne/Developer/embedding.html 从https://github.com/liftoff/GateOne下载的 ...