Hibernate的原生SQL查询
2014-01-14 23:58
357 查看
1. Person和Address实体同前面几篇博客一样,新加一个PersonAddress实体如下:
public class PersonAddress {
private String personName;
private String addressName;
.............
}
2. Person映射文件如下,Address映射文件不变
<?xml version="1.0" encoding="GBK"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="test">
<class name="Person" table="person_inf">
<id name="id" column="id">
<!-- 定义主键生成器策略 -->
<generator class="identity"/>
</id>
<property name="name" type="string"/>
<many-to-one name="address" cascade="all" class="Address" column="address_id" lazy="false"/>
</class>
<!-- 定义一个调用存储过程的命名SQL查询 -->
<sql-query name="callProcedure" callable="true">
<!-- 将查询结果转换成Student实体 -->
<return class="Person">
<!-- 将查询的数据列转换成实体的属性 -->
<return-property name="id" column="id"/>
<return-property name="name" column="name"/>
<return-property name="address" column="address_id"/>
</return>
{call select_all_person()}
</sql-query>
</hibernate-mapping>
3. 测试类
package test;
import org.hibernate.*;
import org.hibernate.transform.*;
import org.hibernate.type.*;
import java.util.*;
public class NativeSQLTest {
public static void main(String[] args) {
NativeSQLTest test = new NativeSQLTest();
// 标量查询
test.scalarQuery();
// 实体查询
test.entityQuery();
// 执行返回多个实体的查询
test.multiEntityQuery();
// 执行返回普通JavaBean的SQL查询, mySql5.1.7,5.1.13会产生异常,3.1.10正常
test.beanQuery();
// 使用关联的原生SQL查询
test.joinQuery();
// 调用存储过程
test.callProcedure();
HibernateUtil.sessionFactory.close();
}
// 执行标量查询
public void scalarQuery() {
Session session = HibernateUtil.currentSession();
Transaction tx = session.beginTransaction();
String sqlString = "select p.* from person_inf as p";
List l = session.createSQLQuery(sqlString)
// 指定查询id和name两个数据列
.addScalar("id", StandardBasicTypes.INTEGER).addScalar("name",
StandardBasicTypes.STRING).list();
for (Iterator it = l.iterator(); it.hasNext();) {
// 每个集合元素都是一个数组,数组元素是id、name两列值。
// 如果select后面只有一个字段,那么返回的List集合元素就不是数组,而是单个的变量值
Object[] row = (Object[]) it.next();
System.out.println("1---" + row[0] + "\t" + row[1]);
}
tx.commit();
HibernateUtil.closeSession();
}
// 执行实体SQL查询
public void entityQuery() {
Session session = HibernateUtil.currentSession();
Transaction tx = session.beginTransaction();
String sqlString = "select * from person_inf where id=:personid";
List l = session.createSQLQuery(sqlString)
// 指定将查询的记录行转换成Person实体,select后面必须选择所有列
.addEntity(Person.class)
// 为SQL字符串的参数设置值
.setInteger("personid", 1).list();
for (Iterator it = l.iterator(); it.hasNext();) {
// 每个集合元素都是一个Person对象
Person p = (Person) it.next();
System.out.println("2---" + p.getId() + "\t" + p.getName() + "\t"
+ p.getAddress().getName());
}
tx.commit();
HibernateUtil.closeSession();
}
// 执行返回多个实体的SQL查询
public void multiEntityQuery() {
Session session = HibernateUtil.currentSession();
Transaction tx = session.beginTransaction();
String sqlString = "select p.*,a.* "
+ "from person_inf p,address_inf a "
+ "where p.address_id = a.id ";
List l = session.createSQLQuery(sqlString)
// 指定将查询的记录行转换成Person实体
.addEntity("p", Person.class).addEntity("a", Address.class)
.list();
tx.commit();
HibernateUtil.closeSession();
// 因为数据已经全部被选出,故程序可以遍历列表中的数据
for (Iterator it = l.iterator(); it.hasNext();) {
// 每个集合元素都是Person、Address组成的数组
Object[] objs = (Object[]) it.next();
Person p = (Person) objs[0];
Address a = (Address) objs[1];
System.out.println("3---" + p.getName() + "\t" + a.getName());
}
}
// 执行返回普通JavaBean的SQL查询
public void beanQuery() {
// 打开Session和事务
Session session = HibernateUtil.currentSession();
Transaction tx = session.beginTransaction();
String sqlString = "select p.name personName, a.name addressName "
+ "from person_inf p,address_inf a "
+ "where p.address_id = a.id ";
List l = session.createSQLQuery(sqlString)
// 指定将查询的记录行转换成PersonAddress对象,此对象只要有getter和setter即可
.setResultTransformer(
Transformers.aliasToBean(PersonAddress.class)).list();
tx.commit();
HibernateUtil.closeSession();
// 因为数据已经全部被选出,故程序可以遍历列表中的数据
for (Iterator it = l.iterator(); it.hasNext();) {
// 每个集合元素都是StudentCourse对象
PersonAddress pa = (PersonAddress) it.next();
System.out.println("4---" + pa.getPersonName() + "\t"
+ pa.getAddressName());
}
}
// 使用关联的原生SQL查询
public void joinQuery() {
// 打开Session和事务
Session session = HibernateUtil.currentSession();
Transaction tx = session.beginTransaction();
String sqlString = "select p.*,a.* "
+ "from person_inf p,address_inf a "
+ "where p.address_id = a.id ";
List l = session.createSQLQuery(sqlString).addEntity("p", Person.class)
.addJoin("a", "p.address").list();
// 提交事务,关闭Session
tx.commit();
HibernateUtil.closeSession();
// 因为数据已经全部被选出,故程序可以遍历列表中的数据
for (Iterator it = l.iterator(); it.hasNext();) {
// 每个集合元素都是Student、Enrolment组成的数组
Object[] objs = (Object[]) it.next();
Person p = (Person) objs[0];
Address a = (Address) objs[1];
System.out.println("5---" + p.getName() + "\t" + a.getName());
}
}
// 调用存储过程,无法分页、不支持关联
private void callProcedure() {
Session session = HibernateUtil.currentSession();
Transaction tx = session.beginTransaction();
// 调用命名查询,直接返回结果
/*
* 存储过程为 :
* CREATE PROCEDURE select_all_person()
* select p.* from
* person_inf p
*/
List l = session.getNamedQuery("callProcedure").list();
tx.commit();
HibernateUtil.closeSession();
// 遍历结果集
for (Iterator it = l.iterator(); it.hasNext();) {
// 每个集合元素是Student对象
Person p = (Person) it.next();
System.out.println("6---" + p.getName());
}
}
}
public class PersonAddress {
private String personName;
private String addressName;
.............
}
2. Person映射文件如下,Address映射文件不变
<?xml version="1.0" encoding="GBK"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="test">
<class name="Person" table="person_inf">
<id name="id" column="id">
<!-- 定义主键生成器策略 -->
<generator class="identity"/>
</id>
<property name="name" type="string"/>
<many-to-one name="address" cascade="all" class="Address" column="address_id" lazy="false"/>
</class>
<!-- 定义一个调用存储过程的命名SQL查询 -->
<sql-query name="callProcedure" callable="true">
<!-- 将查询结果转换成Student实体 -->
<return class="Person">
<!-- 将查询的数据列转换成实体的属性 -->
<return-property name="id" column="id"/>
<return-property name="name" column="name"/>
<return-property name="address" column="address_id"/>
</return>
{call select_all_person()}
</sql-query>
</hibernate-mapping>
3. 测试类
package test;
import org.hibernate.*;
import org.hibernate.transform.*;
import org.hibernate.type.*;
import java.util.*;
public class NativeSQLTest {
public static void main(String[] args) {
NativeSQLTest test = new NativeSQLTest();
// 标量查询
test.scalarQuery();
// 实体查询
test.entityQuery();
// 执行返回多个实体的查询
test.multiEntityQuery();
// 执行返回普通JavaBean的SQL查询, mySql5.1.7,5.1.13会产生异常,3.1.10正常
test.beanQuery();
// 使用关联的原生SQL查询
test.joinQuery();
// 调用存储过程
test.callProcedure();
HibernateUtil.sessionFactory.close();
}
// 执行标量查询
public void scalarQuery() {
Session session = HibernateUtil.currentSession();
Transaction tx = session.beginTransaction();
String sqlString = "select p.* from person_inf as p";
List l = session.createSQLQuery(sqlString)
// 指定查询id和name两个数据列
.addScalar("id", StandardBasicTypes.INTEGER).addScalar("name",
StandardBasicTypes.STRING).list();
for (Iterator it = l.iterator(); it.hasNext();) {
// 每个集合元素都是一个数组,数组元素是id、name两列值。
// 如果select后面只有一个字段,那么返回的List集合元素就不是数组,而是单个的变量值
Object[] row = (Object[]) it.next();
System.out.println("1---" + row[0] + "\t" + row[1]);
}
tx.commit();
HibernateUtil.closeSession();
}
// 执行实体SQL查询
public void entityQuery() {
Session session = HibernateUtil.currentSession();
Transaction tx = session.beginTransaction();
String sqlString = "select * from person_inf where id=:personid";
List l = session.createSQLQuery(sqlString)
// 指定将查询的记录行转换成Person实体,select后面必须选择所有列
.addEntity(Person.class)
// 为SQL字符串的参数设置值
.setInteger("personid", 1).list();
for (Iterator it = l.iterator(); it.hasNext();) {
// 每个集合元素都是一个Person对象
Person p = (Person) it.next();
System.out.println("2---" + p.getId() + "\t" + p.getName() + "\t"
+ p.getAddress().getName());
}
tx.commit();
HibernateUtil.closeSession();
}
// 执行返回多个实体的SQL查询
public void multiEntityQuery() {
Session session = HibernateUtil.currentSession();
Transaction tx = session.beginTransaction();
String sqlString = "select p.*,a.* "
+ "from person_inf p,address_inf a "
+ "where p.address_id = a.id ";
List l = session.createSQLQuery(sqlString)
// 指定将查询的记录行转换成Person实体
.addEntity("p", Person.class).addEntity("a", Address.class)
.list();
tx.commit();
HibernateUtil.closeSession();
// 因为数据已经全部被选出,故程序可以遍历列表中的数据
for (Iterator it = l.iterator(); it.hasNext();) {
// 每个集合元素都是Person、Address组成的数组
Object[] objs = (Object[]) it.next();
Person p = (Person) objs[0];
Address a = (Address) objs[1];
System.out.println("3---" + p.getName() + "\t" + a.getName());
}
}
// 执行返回普通JavaBean的SQL查询
public void beanQuery() {
// 打开Session和事务
Session session = HibernateUtil.currentSession();
Transaction tx = session.beginTransaction();
String sqlString = "select p.name personName, a.name addressName "
+ "from person_inf p,address_inf a "
+ "where p.address_id = a.id ";
List l = session.createSQLQuery(sqlString)
// 指定将查询的记录行转换成PersonAddress对象,此对象只要有getter和setter即可
.setResultTransformer(
Transformers.aliasToBean(PersonAddress.class)).list();
tx.commit();
HibernateUtil.closeSession();
// 因为数据已经全部被选出,故程序可以遍历列表中的数据
for (Iterator it = l.iterator(); it.hasNext();) {
// 每个集合元素都是StudentCourse对象
PersonAddress pa = (PersonAddress) it.next();
System.out.println("4---" + pa.getPersonName() + "\t"
+ pa.getAddressName());
}
}
// 使用关联的原生SQL查询
public void joinQuery() {
// 打开Session和事务
Session session = HibernateUtil.currentSession();
Transaction tx = session.beginTransaction();
String sqlString = "select p.*,a.* "
+ "from person_inf p,address_inf a "
+ "where p.address_id = a.id ";
List l = session.createSQLQuery(sqlString).addEntity("p", Person.class)
.addJoin("a", "p.address").list();
// 提交事务,关闭Session
tx.commit();
HibernateUtil.closeSession();
// 因为数据已经全部被选出,故程序可以遍历列表中的数据
for (Iterator it = l.iterator(); it.hasNext();) {
// 每个集合元素都是Student、Enrolment组成的数组
Object[] objs = (Object[]) it.next();
Person p = (Person) objs[0];
Address a = (Address) objs[1];
System.out.println("5---" + p.getName() + "\t" + a.getName());
}
}
// 调用存储过程,无法分页、不支持关联
private void callProcedure() {
Session session = HibernateUtil.currentSession();
Transaction tx = session.beginTransaction();
// 调用命名查询,直接返回结果
/*
* 存储过程为 :
* CREATE PROCEDURE select_all_person()
* select p.* from
* person_inf p
*/
List l = session.getNamedQuery("callProcedure").list();
tx.commit();
HibernateUtil.closeSession();
// 遍历结果集
for (Iterator it = l.iterator(); it.hasNext();) {
// 每个集合元素是Student对象
Person p = (Person) it.next();
System.out.println("6---" + p.getName());
}
}
}
相关文章推荐
- hibernate参考手册之---原生SQL查询
- 简单修改Hibernate源码,增加使用原生SQL查询时动态addEntity和addScalar功能
- hibernate 用原生sql多表查询 ,字段名重复会被覆盖
- Hibernate-Criteria查询(3)DetachedCriteria构造查询条件、命名查询、原生SQL、调用存储过程(使用JDBC)
- Hibernate使用原生SQL适应复杂数据查询
- hibernate原生sql查询及hql查询
- Hibernate原生SQL查询多表关联,SQL语句要注意的问题
- Hibernate 原生查询 createSQLQuery 详解
- Hibernate使用原生SQL多表查询时字段名相同导致查询数据覆盖问题解决办法
- hibernate原生sql查询(2.1.6)
- hibernate--原生SQL查询无法返回对象集合
- Hibernate 函数 ,子查询 和原生SQL查询
- Hibernate原生SQL查询多表关联,SQL语句要注意的问题
- hibernate中使用原生sql查询
- Hibernate HQL和原生SQL查询的一点区别
- Hibernate执行原生sql将查询结果直接转为VO
- Hibernate SQLQuery 原生SQL 查询及返回结果集处理-1
- hibernate使用原生SQL查询返回结果集的处理
- hibernate原生sql查询
- Hibernate-原生SQL查询