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. shiro集成encache

    针对多频次或者几乎不变的大数量的数据,我们可以通过缓存来实现,具体的比如说权限认证,这个,每次操作都需要权限认证,所以,这里添加encache注解.具体的认证过程是: 1,用户第一次访问用户权限信息, ...

  2. UFLDL深度学习笔记 (七)拓扑稀疏编码与矩阵化

    UFLDL深度学习笔记 (七)拓扑稀疏编码与矩阵化 主要思路 前面几篇所讲的都是围绕神经网络展开的,一个标志就是激活函数非线性:在前人的研究中,也存在线性激活函数的稀疏编码,该方法试图直接学习数据的特 ...

  3. 有关于__align(n) ,内存对齐

    __align __align 关键字指示编译器在 n 字节边界上对齐变量. __align 是一个存储类修饰符.它不影响函数的类型. 语法 __align(n) 其中: n 是对齐边界. 对于局部变 ...

  4. 【入门】创建express项目

    1.创建项目(图解) 2.访问http://localhost:3000/就看到熟悉的页面了 3.查看项目目录     参考文档:http://jingyan.baidu.com/article/92 ...

  5. java getResourcesAsStream()如何获取WEB-INF下的文件流

    getResourcesAsStream()来读取.properties文件,但是getResourcesAsStream()仅在java项目时能获取根目录的文件: 在web项目中,getResour ...

  6. Web存储使用详解(本地存储、会话存储)

    Web存储使用详解(本地存储.会话存储)1,Web存储介绍HTML5的Web存储功能是让网页在用户计算机上保存一些信息.Web存储又分为两种:(1)本地存储,对应 localStorage 对象.用于 ...

  7. 在Linux先显示文件

    cat:从第一行开始显示文件内容. tac:从最后一行开始显示内容. nl:显示的时候带行号. more:一页一页显示. less:同more,可以向上翻页. head:显示文件前几行. head - ...

  8. c#中关于compare比较的一点注意事项

    一直没有太注意,今天发现在compare比较两个字符串的时候出了点小问题 如果我设置了两个字符串 一个是“2”,一个是“12” 那么在比较的时候 第一个会大于第二个: 如果第一个是“02”,第二个是“ ...

  9. Intellij IDEA打开多项目窗口

    我版本是2016.02.04 其他版本可能不一样的设置

  10. react create app ,nginx服务器配置

    server{ listen 80; server_name www.domain.com domain.com; location ~* \.js$ { root /home/hard/Projec ...