`
Supanccy2013
  • 浏览: 222722 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

Hibernate 原生sql查询

阅读更多
1,Person
package com.supan.bean;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
public class Person {
	private int id;
	private String name;
	private int age;
    private Set<Address> addresss = new HashSet<Address>();
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	public Set<Address> getAddresss() {
		return addresss;
	}
	public void setAddresss(Set<Address> addresss) {
		this.addresss = addresss;
	}
}


2,Address类
package com.supan.bean;
public class Address {
	private int id;
	private String name;
	private String info;
    private String remark;
    private Person person;
	public Person getPerson() {
		return person;
	}
	public void setPerson(Person person) {
		this.person = person;
	}
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getInfo() {
		return info;
	}
	public void setInfo(String info) {
		this.info = info;
	}
	public String getRemark() {
		return remark;
	}
	public void setRemark(String remark) {
		this.remark = remark;
	}
}


3,Person映射文件
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping default-lazy="true" default-access="property" package="com.supan.bean" >
    <class name="Person" dynamic-update="true" dynamic-insert="true" table="myperson">
        <id name="id" column="id" type="integer">
            <generator class="native"/>
        </id>
        <property name="name" type="string" column="name" length="20"/>
        <property name="age" type="integer" column="age" length="3"/>
        <set name="addresss" inverse="true" cascade="all" >
             <key column="personid"/>
             <one-to-many class="Address"/>
        </set>
    </class>
</hibernate-mapping>


4,Address映射文件
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping default-lazy="true" default-access="property" package="com.supan.bean" >
    <class name="Address" dynamic-update="true" dynamic-insert="true" table="address">
        <id name="id" column="id" type="integer">
            <generator class="native"/>
        </id>
        <property name="name" type="string" column="NAME" length="20"/>
        <property name="info" type="string" column="INFO" length="30"/>
        <property name="remark" type="string" column="REMARK" length="30"/>
        <many-to-one name="person" class="Person" column="personid" cascade="all"></many-to-one>
    </class>
</hibernate-mapping>


5,原生sql的测试类。
	/**
	 * <测试Hibernate的原生态sql查询> <查询多列返回来的是Object数组的list>
	 * 
	 * @author chenchaoyang
	 * @since 2014-03-22
	 */
	public void testSql1() {
		Configuration config = new Configuration().configure();
		SessionFactory sf = config.buildSessionFactory();
		Session sess = sf.openSession();
		Transaction tx = (Transaction) sess.beginTransaction();
		/** 注意 myperson是数据库中的表的名字,不是实体类的名字 */
		String sql = "select * from myperson";
		/** 注意饭回来的list中装的是Object[]数组,不同于hql查询是出来list中装的是实体 */
		List<Object[]> result = (List<Object[]>) sess.createSQLQuery(sql)
				.list();
		for (Object[] temp : result) {
			for (int i = 0; i < temp.length; i++) {
				System.out.println(temp[i]);
			}
		}
		tx.commit();
		sess.close();
	}

	/**
	 * <测试Hibernate的原生态sql查询> <查询单列,返回的是单个的值而不是object数组>
	 * 
	 * @author chenchaoyang
	 * @since 2014-03-22
	 */
	public void testSql2() {
		Configuration config = new Configuration().configure();
		SessionFactory sf = config.buildSessionFactory();
		Session sess = sf.openSession();
		Transaction tx = (Transaction) sess.beginTransaction();
		/** 注意 myperson是数据库中的表的名字,不是实体类的名字 */
		String sql = "select p.id from myperson p";
		/** 注意饭回来的list中装的是Object[]数组,不同于hql查询是出来list中装的是实体 */
		List result = sess.createSQLQuery(sql).list();
		if (result != null && result.size() > 0) {
			for (int i = 0; i < result.size(); i++) {
				System.out.println(result.get(i));
			}
		}
		tx.commit();
		sess.close();
	}

	/**
	 * <测试Hibernate的原生态sql查询--实体查询.的addEntity方法>
	 * <addEntity方法:在查詢一个实体的全部属性的时候,用addEntity方法可以把 查询结构封装陈实体对象的list>
	 * 注意:使用原生sql的实体查询,必须查询出所有的字段,如果有many-to-one也必须列出这个外键列,否则会报错
	 * clumn not found,最简单的就是select *
	 * 下面的方法用select *
	 * @author chenchaoyang
	 * @since 2014-03-22
	 */
	@SuppressWarnings(value = "unchecked")
	public void testSql3() {
		Configuration config = new Configuration().configure();
		SessionFactory sf = config.buildSessionFactory();
		Session sess = sf.openSession();
		Transaction tx = (Transaction) sess.beginTransaction();
		/** 注意 myperson是数据库中的表的名字,不是实体类的名字 */
		String sql = "select * from address a";
		/** 注意饭回来的list中装的是Object[]数组,不同于hql查询是出来list中装的是实体 */
		List<Address> result = (List<Address>) sess.createSQLQuery(sql)
				.addEntity(Address.class).list();
		for (Address address : result) {
			System.out.println(address.getId());
			System.out.println(address.getName());
			System.out.println(address.getInfo());
			System.out.println(address.getRemark());
			System.out.println(address.getPerson().getName());
			System.out.println("********************");

		}
		tx.commit();
		sess.close();
	}
	/**
	 * 输出: Hibernate: select person0_.id as id0_0_, person0_.name as name0_0_,
	 * person0_.age as age0_0_ from myperson person0_ where person0_.id=? 陈超阳
	 ******************** 
	 * 15 坂田五里围 我目前居住的地方 附近的消费很低 陈超阳
	 ******************** 
	 * 17 佛山 男孩 目前已经不再那里居住了 丽娟
	 ******************** 
	 */
	
	
	/**
	 * <测试Hibernate的原生态sql查询,的addEntity方法>
	 * <addEntity方法:在查詢一个实体的全部属性的时候,用addEntity方法可以把 查询结构封装陈实体对象的list>
	 * 注意:使用原生sql的实体查询,必须查询出所有的字段,如果有many-to-one也必须列出这个外键列,否则会报错
	 * 下面的方法用select 全部字段名称,和上一个方法的作用相同
	 * @author chenchaoyang
	 * @since 2014-03-22
	 */
	@SuppressWarnings(value = "unchecked")
	public void testSql4() {
		Configuration config = new Configuration().configure();
		SessionFactory sf = config.buildSessionFactory();
		Session sess = sf.openSession();
		Transaction tx = (Transaction) sess.beginTransaction();
		/** 注意 myperson是数据库中的表的名字,不是实体类的名字 */
		String sql = "select a.id,a.name,a.info,a.remark,a.personid from address a";
		/** 注意饭回来的list中装的是Object[]数组,不同于hql查询是出来list中装的是实体 */
		List<Address> result = (List<Address>) sess.createSQLQuery(sql)
				.addEntity(Address.class).list();
		for (Address address : result) {
			System.out.println(address.getId());
			System.out.println(address.getName());
			System.out.println(address.getInfo());
			System.out.println(address.getRemark());
			System.out.println(address.getPerson().getName());
			System.out.println("********************");
		}
		tx.commit();
		sess.close();
	}
	
	
	/**
	 * <测试Hibernate的原生态sql查询同样可以传递参数>
	 * @author chenchaoyang
	 * @since 2014-03-22
	 */
	@SuppressWarnings(value = "unchecked")
	public void testSql5() {
		Configuration config = new Configuration().configure();
		SessionFactory sf = config.buildSessionFactory();
		Session sess = sf.openSession();
		Transaction tx = (Transaction) sess.beginTransaction();
		/** 注意参数的形式是  :参数名字 */
		String sql = "select a.id,a.name,a.info,a.remark,a.personid from address a where a.name = :name";
		/** 注意传递参数的形式*/
		List<Address> result = (List<Address>) sess.createSQLQuery(sql)
				.addEntity(Address.class).setString("name", "英国伦敦").list();
		for (Address address : result) {
			System.out.println(address.getId());
			System.out.println(address.getName());
			System.out.println(address.getInfo());
			System.out.println(address.getRemark());
			System.out.println(address.getPerson().getName());
			System.out.println("********************");
		}
		tx.commit();
		sess.close();
	}
	
	/**
	 * <测试Hibernate的原生态sql将查询结果映射成多个实体>
	 * @author chenchaoyang
	 * @since 2014-03-22
	 */
	@SuppressWarnings(value = "unchecked")
	public void testSql6() {
		Configuration config = new Configuration().configure();
		SessionFactory sf = config.buildSessionFactory();
		Session sess = sf.openSession();
		Transaction tx = (Transaction) sess.beginTransaction();
		/** 注意参数的形式是  :参数名字 */
		String sql = "select p.*,a.* from myperson p,address a where p.id = a.personid";
		/** 注意传递参数的形式*/
		List<Object[]> result = (List<Object[]>) sess.createSQLQuery(sql)
				.addEntity("p",Person.class)
				.addEntity("a",Address.class).list();
		for(Object[] temp : result)
		{
			Person tempPerson = (Person)temp[0];
			System.out.print(tempPerson.getId());
			System.out.print(tempPerson.getName());
			System.out.println(tempPerson.getAge());
			
			Address tempAddress = (Address)temp[1];
			System.out.print(tempAddress.getId());
			System.out.print(tempAddress.getName());
			System.out.println(tempAddress.getInfo());
		}
		tx.commit();
		sess.close();
	}


分享到:
评论

相关推荐

    hibernate执行原生sql语句

    "hibernate执行原生sql语句" Hibernate 是一种流行的 ORM(Object-Relational Mapping)框架,用于将 Java 对象映射到关系数据库中。然而,在一些情况下,我们需要直接执行原生 SQL 语句,而不是使用 Hibernate 的...

    hibernate 执行原生sql的几种方式

    如果你希望在配置文件中预定义一个原生SQL查询,可以使用`@NamedNativeQuery`注解。这使得代码更加整洁,易于管理。 ```java @Entity @Table(name = "User") @NamedNativeQuery( name = "User.findAll", ...

    Hibernate 函数 ,子查询 和原生SQL查询

    **Hibernate函数** ...当ORM无法满足需求时,原生SQL查询则提供了一种灵活的方式,以直接操作数据库的能力来解决特定问题。理解和熟练运用这些特性,对于提升Java开发中的数据库操作效率至关重要。

    Hibernate之原生Native SQL查询

    当然,原生SQL查询也有一些需要注意的地方。由于直接操作SQL,所以数据库的兼容性问题需要开发者自己处理。此外,如果查询结果需要映射到多个实体类,或者返回复杂的结果集,那么处理起来可能会比较麻烦,需要手动...

    Hibernate中的查询:HQL、Criteria、原生SQl

    原生SQL查询可以返回结果集、单个值或自定义的结果类型。但需要注意的是,这种方式可能会丢失一些Hibernate的自动转换和事务管理功能。 总结,Hibernate提供了多种查询方式以适应不同场景的需求。HQL适用于大多数...

    spring+hibernate,自己封装了原生sql的处理,模仿mybatis使用

    描述中提到"自己封装了原生sql的处理,模仿mybatis使用",这意味着开发者在项目中创建了一个类似MyBatis的简单SQL解析器。MyBatis是一个轻量级的持久层框架,它允许开发者编写原生的SQL语句并将其与Java代码绑定。...

    hibernate将本地SQL查询结果封装成对象

    首先,本地SQL查询(Native SQL)是指直接在Hibernate中使用原生的SQL语句进行查询,而不是使用HQL(Hibernate Query Language)。这允许开发者充分利用SQL的功能,比如进行复杂的统计计算或者处理特定数据库的特性...

    hibernate将本地SQL查询结果封装成对象(最终)

    使用本地sql语句查询后,无需再使用Object对查询结果进行强制转换,而是直接将查询结果放到实体Bean里了。 PS: 其实只有一版,这里只所以叫最终版是因为该附件我上传了好几天传不上去,到最后报告说‘资源已经存在...

    Hibernate中Sql语句

    在Java开发中,Hibernate作为一个非常流行的ORM框架,提供了多种查询方式,其中就包括了HQL(Hibernate Query Language)和原生SQL查询。本文将针对给定代码片段中的核心知识点——如何在Hibernate中使用原生SQL而非...

    Hibernate SQLQuery执行原生SQL.docx

    本文将深入探讨Hibernate如何通过SQLQuery接口执行原生SQL查询,并展示如何处理查询结果。 一、创建SQLQuery对象 在Hibernate中,我们通常通过Session接口的createSQLQuery方法来创建SQLQuery对象,例如: ```...

    Hibernate+本地SQL查询SQLQuery宣贯.pdf

    在某些情况下,开发者可能需要使用原生SQL查询来执行特定的数据库操作,这时就可以利用Hibernate的SQLQuery功能。本文将详细讲解如何使用Hibernate的SQLQuery进行本地SQL查询。 首先,创建SQLQuery实例是通过...

    hibernate将本地SQL查询结果封装成对象(最终).zip

    Hibernate支持两种类型的查询:原生SQL查询和Hibernate查询语言(HQL)。原生SQL查询允许开发者直接执行SQL语句,而HQL则是面向对象的查询语言,类似于SQL但更接近于Java。 4. 封装SQL查询结果为对象: - `...

    Hibernate连表查询 Hibernate连表查询

    例如,在`findAllbyString`方法中,使用了`getSession().createSQLQuery`方法来执行原生SQL查询: ```java String queryString = "Select * from h_attribute t where ciid=24 and Isinstance=1 and Isdisplay=1"; ...

    hibernate数据库通用SQL代码

    查询数据的方法有两种实现,一种是基于HQL(Hibernate Query Language),另一种是基于原生SQL。 - 基于HQL的通用查询: HQL是Hibernate提供的面向对象的查询语言,可以方便地操作对象和属性。`select`方法接收一个...

    struts+hibernate+sql server2005分页的小项目

    由于Hibernate支持SQL Server 2005,因此我们可以通过HQL(Hibernate Query Language)或者原生SQL来实现分页查询。 **4. 分页实现** 在本项目中,分页通常包含以下步骤: - **计算总记录数**:使用Hibernate的...

    关于Hibernate分页类和jdbc的sql分页完美融合

    这样的类通常会有一个用于执行分页查询的方法,比如`doPagingQuery`,它接受SQL查询语句、起始索引、每页大小等参数,并返回一个自定义的分页对象,如"Page.java"所示。 `Page.java`文件可能定义了一个名为`Page`的...

    mybatis,ibatis,hibernate 显示查询SQL

    为了显示查询SQL,Hibernate 提供了`hibernatetool`,可以生成SQL脚本,或者通过配置`logging.level.org.hibernate.SQL`来打印SQL语句。此外,Hibernate的日志系统支持JDK Logging、Log4j 和 SLF4J。 **显示查询SQL...

    Hibernate SQLQuery 查询Oracle char类型结果为一个字符解决方法

    在Hibernate中执行原生SQL查询时,可以通过`addScalar`方法指定返回值的类型,从而改变Hibernate对char类型字段的处理方式。具体操作如下: ```java Session session = this.getSession(); SQLQuery query = ...

    Hibernate+本地SQL查询SQLQuery.pdf

    原生SQL查询可能返回单一标量值或混合标量值与实体的结果。例如,查询猫的最大体重: ```java Double max = (Double) sess.createSQLQuery("select max(cat.weight) as maxWeight from cats cat") .addScalar(...

    Hibernat使用原生的SQL

    5. **JPA的@NamedNativeQuery**: 如果项目同时使用了JPA,可以通过在实体类上定义@NamedNativeQuery注解来声明原生SQL查询。 在实际开发中,使用原生SQL时需注意以下几点: - **事务管理**: 由于原生SQL不在...

Global site tag (gtag.js) - Google Analytics