1、hibernate 也可以通过标准的 SQL 进行查询

(1)、将SQL查询写在 java 代码中

/**
* 查询所有
*/
@Test
public void testQuery(){
// 基于标准的 sql 语句查询
String sql = "select * from t_person";
// 通过 createSQLQuery 获取 SQLQuery,而 SQLQuer 是 Query的子类
SQLQuery query = session.createSQLQuery(sql);
// 因为是基于表的操作,所以返回的是标准值的Object数组
List<Object[]> list = query.list();
for(Object[] objs : list){
System.out.println(Arrays.toString(objs));
}
} @Test
public void testQuery2(){
// 基于标准的 sql 语句查询
String sql = "select * from t_person";
// 通过 createSQLQuery 获取 SQLQuery,而 SQLQuer 是 Query的子类
SQLQuery query = session.createSQLQuery(sql);
// 指定查询结果与某个持久化类绑定
query.addEntity(Person.class);
List<Person> list = query.list();
for(Person p : list){
System.out.println(p);
}
} @Test
public void testQuery3(){
// 基于标准的 sql 语句查询
String sql = "select * from t_person where id in (:ids)";
// 通过 createSQLQuery 获取 SQLQuery,而 SQLQuer 是 Query的子类
SQLQuery query = session.createSQLQuery(sql);
// 指定查询结果与某个持久化类绑定
query.addEntity(Person.class);
// 绑定参数
query.setParameterList("ids", new Object[]{3,6,9});
List<Person> list = query.list();
for(Person p : list){
System.out.println(p);
}
}

(2)、将SQL语句写在配置文件中

配置文件:

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="learn.hibernate.bean">
<sql-query name="mysqlquery">
<![CDATA[select * from t_person where id < :id]]>
</sql-query>
</hibernate-mapping>

java 代码:

@Test
public void testQuery4(){
Query query = session.getNamedQuery("mysqlquery");
query.setInteger("id", 8);
List<Object[]> list = query.list();
for(Object[] objs : list){
System.out.println(Arrays.toString(objs));
}
}

2、数据抓取策略

数据抓取通过持久化映射文件来配置,代码如下:

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="learn.hibernate.bean">
<class name="Person" table="t_person">
<id name="id" column="person_id">
<generator class="native"/>
</id>
<property name="name" column="t_name"/>
<property name="age"/>
<property name="passwork"/>
<property name="birthday"/>
<!--
fetch 数据抓取策略
join 表示通过连接语句,将关联的数据获取到,立即查询
select(默认) 表示通过另外的一条sql语句查询出关联数据,要用到的时候才会发起查询,延迟查询
subselect 通过另外的一条SQL语句查询,要用到时候才会发起查询,延迟查询
-->
<set name="addres" cascade="all" inverse="true" fetch="join">
<!-- 指定 addres 集合中的数据对应t_person的的一个外键 -->
<key column="p_id"/>
<!-- 指定Person 关联的实例类型 -->
<one-to-many class="Address"/>
</set>
</class>
<class name="Address" table="t_address">
<id name="id">
<generator class="native"/>
</id>
<property name="zipCode"/>
<property name="address"/>
<!--
多的一端使用 many-to-one 进行配置
-->
<many-to-one name="person" column="p_id"/>
</class>
</hibernate-mapping>

java代码如下:

/**
* 批量写入数据
*/
@Test
public void testAdd(){
tx = session.beginTransaction();
for(int i = 0; i < 10; i++){
Person person = new Person("ldh_"+i, 22+i, 123456+i, new Date()); Set<Address> addSet = new HashSet<Address>();
for(int j = 0; j < 10; j++){
Address add = new Address("5000"+i+j,"湖南郴州"+j);
add.setPerson(person);
addSet.add(add);
}
person.setAddres(addSet); session.persist(person);
if(i % 10 == 0){
session.flush();
session.clear();
}
}
tx.commit();
} @Test
public void testQuery(){
Person p = (Person)session.get(Person.class, 1);
System.out.println(p);
System.out.println(p.getAddres().size());
}

3、批量抓取

持久化映射文件代码如下:

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="learn.hibernate.bean">
<class name="Person" table="t_person">
<id name="id" column="person_id">
<generator class="native"/>
</id>
<property name="name" column="t_name"/>
<property name="age"/>
<property name="passwork"/>
<property name="birthday"/>
<!--
fetch 数据抓取策略
join 表示通过连接语句,将关联的数据获取到,立即查询
select(默认) 表示通过另外的一条sql语句查询出关联数据,要用到的时候才会发起查询,延迟查询
subselect 通过另外的一条SQL语句查询,要用到时候才会发起查询,延迟查询 如果查询的数据比较多可以用 batch-size 来提高搜索
例如:batch-size="3" 批量抓取,表示每次查询出三条关联数据,如果有10条记录,那么会分四次查询出来
-->
<set name="addres" cascade="all" inverse="true" batch-size="3">
<!-- 指定 addres 集合中的数据对应t_person的的一个外键 -->
<key column="p_id"/>
<!-- 指定Person 关联的实例类型 -->
<one-to-many class="Address"/>
</set>
</class>
<class name="Address" table="t_address">
<id name="id">
<generator class="native"/>
</id>
<property name="zipCode"/>
<property name="address"/>
<!--
多的一端使用 many-to-one 进行配置
-->
<many-to-one name="person" column="p_id"/>
</class>
</hibernate-mapping>

java 代码如下:

@Test
public void testQuery2(){
Query query = session.createQuery("from Person");
List<Person> list = query.list();
for(Person p : list){
System.out.println(p);
System.out.println("------------------------");
Set<Address> adds = p.getAddres();
Address[] arr = new Address[adds.size()];
adds.toArray(arr);
System.out.println(Arrays.toString(arr));
}
}

可以查看:http://www.cnblogs.com/rongxh7/archive/2010/05/12/1733088.html

Hibernate学习---第十一节:Hibernate之数据抓取策略&批量抓取的更多相关文章

  1. 风炫安全WEB安全学习第二十一节课 存储型XSS讲解

    风炫安全WEB安全学习第二十一节课 存储型XSS讲解 存储型XSS演示 存储型XSS,持久化,代码是存储在服务器中的,如在个人信息或发表文章等地方,加入代码,如果没有过滤或过滤不严,那么这些代码将储存 ...

  2. Hibernate学习---第七节:关联关系

    一.关联关系一对一外键(双向) 1.实体类,代码如下: package learn.hibernate.bean; import java.util.Date; /** * 持久化类设计 * 注意: ...

  3. Hibernate学习---第六节:数组&list&map&set的映射配置

    1.实体类,代码如下: package learn.hibernate.bean; import java.util.Date; import java.util.HashMap; import ja ...

  4. Hibernate学习笔记二:Hibernate缓存策略详解

    一:为什么使用Hibernate缓存: Hibernate是一个持久层框架,经常访问物理数据库. 为了降低应用程序访问物理数据库的频次,从而提高应用程序的性能. 缓存内的数据是对物理数据源的复制,应用 ...

  5. Hibernate学习---第十二节:Hibernate之锁机制&乐观锁实现

    1.悲观锁 它指的是对数据被外界修改保持保守态度,因些,在整个数据处理过程中,将数据牌锁定状态.悲观锁的实现,往往依靠数据库提供的锁机制(也只有数据库层的锁机制才能保证数据访问的排他性,否则,即使在本 ...

  6. 【mongodb系统学习之十一】mongodb删除数据

    十一.mongodb删除数据: 1).删除全部文档:remove,语法db.collectionName.remove({}):小括号里边必须要有条件,否则不成功:如果只是一个空的{},则会删除集合内 ...

  7. Hibernate学习---第五节:普通组件和动态组件

    一.普通组件映射配置 1.创建组件类,代码如下: package learn.hibernate.bean; /** * 组件类 */ public class Phones { private St ...

  8. Hibernate学习---第十节:Hibernate之QBC、样例查询&离线查询

    一.QBC (Query By Criteria) 主要有Criteria,Criterion,Oder,Restrictions类组成 1.java 代码如下: /** * 查询所有 */ @Tes ...

  9. Hibernate学习笔记--第一个Hibernate框架程序

    一般使用集成开发环境是,把所需的类库添加到项目属性的库路径中,开发工具在部署时会自动复制所需要的类包到WEB-INF\lib目录下 MyEclipse中: 创建项目,右击项目->myeclips ...

随机推荐

  1. apache占用内存高解决办法

    我用512M的vps,访问量不大,但内存占用很大,甚至宕机. 我用top,然后shitf+m发现,httpd占用内存极大.经过网上找资料设置后,用过一段时间终于没再出现内存问题了. 首先查找配置文件的 ...

  2. 跳转 nginx 跳转 apache跳转

    公司在google上投广告,需要做一些很简单的站去google上投广告,当用户在google上点击那些很简单的网站的时候,就会跳转到真实的网站.但是,如果用户直接在浏览器输入域名,并访问的话,那样就不 ...

  3. mysqldump默认参数add-drop-table

    mysqldump默认参数add-drop-table 原创 2014年01月28日 11:35:18 9214 接到一个同事电话,说UAT环境上的一张表被删了,要恢复一下.原来是新项目UAT,从测试 ...

  4. Android ijkplayer 强大的视频播放器框架教程 -- 导入demo运行(一)

    首先介绍下这个开源项目,这个开源项目是BiliBli 开源的,首先感谢他们的团队. 这是开源的地址: https://github.com/Bilibili/ijkplayer 首先我为什么要选这个, ...

  5. 可执行jar包

    我已经解决了这个问题,在eclipse中有一个打包工具,可以将程序打包成.jar文件: 右键要打包的 project--->Export--->Java--->JAR file--- ...

  6. saltstack内置执行模块useradd

    useradd模块用于命令行管理用户 salt.modules.useradd.add(name, uid=None, gid=None, groups=None, home=None, shell= ...

  7. 【Atheros】网卡驱动速率调整算法概述

    我做网卡驱动,最主要的内容就是设计和改进速率调整算法,随着802.11协议簇的新标准越来越多,速率越来越高,调制编码方式也越来越多,一般来说,速率越高越可能丢包,速率越低越稳定,这是整体状况,但不是必 ...

  8. android 二维码制作,显示到UI,并保存SD卡,拿来就能用!!

    转载请注明出处:王亟亟的大牛之路 如今二维码已经渗透了我们的生活.各种扫码关注啊.扫码下载的,今天上一个依据输入内容生成二维码的功能. 包结构: 界面截图: 功能:输入网址–>生成图片–> ...

  9. 使用Swoole加速Laravel(正式环境中)

    1 Laravel的速度瓶颈在哪? 1.1 已有的一些优化方法 1.1.1 laravel官方提供了一些优化laravel的优化方法 php artisan optimize php artisan ...

  10. spring工作原理理解

    spring的工作原理 spring是作为一个容器存在的框架,可以加载spring web,spring mvc,spring orm,sprong aop,spring dao等框架和模块,其主要核 ...