`
ITCheng
  • 浏览: 76598 次
  • 来自: 北京
社区版块
存档分类
最新评论

Hibernate_多种查询模式介绍

阅读更多
package com.sun.test;

import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;

import org.hibernate.Criteria;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.criterion.Projections;
import org.junit.After;
import org.junit.Before;

import com.sun.dao.impl.HibernateSessionFactory;
import com.sun.entity.District;
import com.sun.entity.House;
import com.sun.entity.Street;
@SuppressWarnings("unchecked")
public class TestHib {

	private Session session;

	@Before
	public void before() {
		session = HibernateSessionFactory.getSession();
	}

	@After
	public void after() {
		session.close();
	}

	@org.junit.Test
	public void queryBase() {
		List<House> list = session.createQuery(
				"select h from House h where price>2000").list();
		for (House h : list) {
			System.out.println(h.getTitle());
		}
	}

	// 查询部分属性
	@org.junit.Test
	public void queryPro() {
		List<Object[]> list = session.createQuery(
				"select h.title,h.price from House h where price>2000").list();
		for (Object[] h : list) {
			System.out.println(h[0] + "=========" + h[1]);
		}
	}

	@org.junit.Test
	public void queryPro1() {
		// 要求:一定要有对应的构造方法
		List<House> list = session
				.createQuery(
						"select new House(h.title,h.price) from House h where price>2000")
				.list();
		for (House h : list) {
			System.out.println(h.getTitle());
		}
	}

	@org.junit.Test
	public void queryPro2() {

		List<Map> list = session
				.createQuery(
						"select new Map(h.title as t,h.price as p) from House h where price>2000")
				.list();
		for (Map h : list) {
			System.out.println(h.get("t") + "--------" + h.get("p"));
		}
	}

	@org.junit.Test
	public void queryFun() {
		// 包装类
		int count = (Integer) session.createQuery(
				"select count(*) from House h where price>2000").uniqueResult();
		System.out.println(count);

	}

	@SuppressWarnings("unchecked")
	@org.junit.Test
	public void queryParam() {

		List<House> list = session.createQuery(
				"select h from House h where price>:price1 and price <:price2")
				.setLong("price1", 2000l).setLong("price2", 10000l).list();
		for (House h : list) {
			System.out.println(h.getTitle());
		}

	}

	@SuppressWarnings("unchecked")
	@org.junit.Test
	public void queryParam1() {
		// 参数名和属性名相同
		Query query = session
				.createQuery("select h from House h where h.title like :title");
		House house = new House();
		house.setTitle("%江%");
		query.setProperties(house);
		List<House> list = query.list();
		for (House h : list) {
			System.out.println(h.getTitle());
		}

	}

	/**
	 * 1.如果没有对应的数据,load会异常 2.load支持延时加载
	 * 
	 */
	@org.junit.Test
	public void load() {
		House house = (House) session.load(House.class, 1L);
		System.out.println(house.getTitle());
	}

	@org.junit.Test
	public void get() {
		House house = (House) session.get(House.class, 1L);
		System.out.println(house.getTitle());
	}

	// 默认是select(生成两条sql)
	// fetch="join"生成一条outer left join语句
	@org.junit.Test
	public void fetch() {
		House house = (House) session.get(House.class, 1L);
		System.out.println(house.getTitle());
		System.out.println(house.getUsers().getName());
	}

	@org.junit.Test
	public void lazySet() {
		District district = (District) session.get(District.class, 1L);
		System.out.println(district.getName());

		Set<Street> set = district.getStreets();
		Iterator<Street> it = set.iterator();// 迭代器
		while (it.hasNext()) {
			Street s = it.next();
			System.out.println(s.getName());
		}
		// for(Street s:set){
		// System.out.println(s.getName());
		// }

	}

	/**
	 * list不从缓存取数据,iterate根据id先找缓存中是否存在数据,数据没有再查数据库
	 * 
	 */
	@SuppressWarnings("unchecked")
	@org.junit.Test
	public void iterateAndList() {
		Query query = session.createQuery("select h from  House h");

		// List<House> list=query.list();
		// for(House s:list){
		// System.out.println("title==="+s.getTitle());
		// System.out.println("name==="+s.getUsers().getName());
		// }

		System.out.println("=======================");
		Iterator<House> it = query.iterate();

		while (it.hasNext()) {
			House s = it.next();
			System.out.println(s.getTitle());
			System.out.println("name===" + s.getUsers().getName());
		}

	}

	@org.junit.Test
	public void iterate() {
		Query query = session.createQuery("select h from  House h");

		Iterator<House> it = query.iterate();

		while (it.hasNext()) {
			House s = it.next();
			System.out.println(s.getTitle());
		}
		System.out.println("=======================");
		it = query.iterate();

		while (it.hasNext()) {
			House s = it.next();
			System.out.println(s.getTitle());
		}
	}
	@org.junit.Test
	public void manyTableJoin() {
		Session session = HibernateSessionFactory.getSession();
		Query query = session
				.createQuery("select h from  House h inner join fetch h.street s inner join fetch  s.district");
		List<House> list = query.list();
		House house = list.get(0);
		System.out.println("=======================" + house.getTitle());

		session.close();
		System.out.println(house.getStreet().getName() + "==="
				+ house.getStreet().getDistrict().getName());
	}

	@org.junit.Test
	public void innerJoin() {
		// select d,s from District d inner join d.streets s
		Query query = session
				.createQuery("from District d inner join d.streets");
		List<Object[]> list = query.list();
		for (Object[] o : list) {
			District district = (District) o[0];
			Street street = (Street) o[1];
			System.out.println(district.getName() + "===" + street.getName());
		}

	}

	@org.junit.Test
	public void innerFetchJoin() {

		Query query = session
				.createQuery("from District d inner join fetch d.streets");
		List<District> list = query.list();
		for (District d : list) {
			System.out.println(d.getName());
		}

	}

	@org.junit.Test
	public void leftJoin() {
		// select d,s from District d inner join d.streets s
		Query query = session
				.createQuery("from District d right join fetch d.streets");
		List list = query.list();
		System.out.println(list);
//		for (Object[] o : list) {
//			District district = (District) o[0];
//			Street street = (Street) o[1];
//			System.out.println(district.getName() + "===" + street.getName());
//		}

	}
   
	@org.junit.Test
	public void queryByName() {
		Query query=session.getNamedQuery("queryStreet");
		List<Street> list=query.setString("name", "%北%").list();
		for(Street s:list){
			System.out.println(s.getName()+"==="+s.getDistrict().getName());
		}
	}
	
	//直接加addEntity就可以转换类型了

	@org.junit.Test
	public void queryBySQL() {
		//返回类型addEntity
		List<Street> list=session.createSQLQuery("select * from street").addEntity(Street.class).list();
		System.out.println(list);
		for(Street s:list){
			System.out.println(s.getName()+"==="+s.getDistrict().getName());
		}
	}
	
	//在类得映射文件中配置

	<sql-query name="querySql">
     <![CDATA[
         select {s.*} from street s where name like :name
       ]]>
       <return alias="s" class="com.accp.entity.Street"></return>
    </sql-query>
    <sql-query name="querySqlByName">
     <![CDATA[
         select s.name from street s where name like :name
       ]]>
	<!--       <return alias="s" class="com.accp.entity.Street"></return>-->
      <return-scalar column="name" type="java.lang.String"/>
    </sql-query>

	@org.junit.Test
	public void queryBySQLXML() {
		Query query=session.getNamedQuery("querySql");
		List<Street> list=query.setString("name", "%北%").list();
		for(Street s:list){
			System.out.println(s.getName()+"==="+s.getDistrict().getName());
		}
	}

	@org.junit.Test
	public void queryBySQLXMLByName() {
		Query query=session.getNamedQuery("querySqlByName");
		List<String> list=query.setString("name", "%北%").list();
		for(String s:list){
			System.out.println(s);
		}
	}
	

	@org.junit.Test
	public void projections() {
		Criteria c=session.createCriteria(House.class);
		int count=(Integer)c.setProjection(Projections.rowCount()).uniqueResult();
		System.out.println(count);
		
	}
	@org.junit.Test
	public void projections1() {
		Criteria c=session.createCriteria(House.class);
		List<Object[]> list=c.setProjection(Projections.projectionList().add(Projections.avg("price"))
	    .add(Projections.groupProperty("title")).add(Projections.rowCount())).list();
		for(Object[] obj:list){
			System.out.println(obj[0]+"==="+obj[1]);
		}
	}
}

 

分享到:
评论

相关推荐

    Struts_Hibernate_struts;hibernate_

    Hibernate支持事务管理、缓存机制、一对多、多对一、一对一等多种关系映射,提供了方便的数据查询和更新功能。 **结合使用Struts和Hibernate**: 在学生选课系统中,Struts作为前端控制器,处理用户请求,调用业务...

    Hibernate_Validator_reference中文版@www.java1234.com.pdf

    Hibernate Validator提供了多种配置方式,包括使用XML配置。该文档对如何使用 validation.xml 文件和如何映射约束做了说明。在启动框架时,需要配置和初始化 ValidatorFactory,该文档也对此有所涉及。 Hibernate ...

    图书管理系统-BookM_JSF_Hibernate_Spring

    综上所述,《图书管理系统-BookM_JSF_Hibernate_Spring》是一个集成了多种Java技术的高效系统,它利用JSF实现用户界面,Hibernate处理数据持久化,Spring管理组件并提供事务处理,以及ajax4jsf优化用户体验。...

    springmvc_hibernate_ibatis_jdbc

    Hibernate支持事务管理、缓存机制和多种数据库平台,大大提高了开发效率。 3. **iBatis**:iBatis也是一个ORM框架,但它比Hibernate更轻量级。它主要关注SQL查询,将SQL语句与Java代码分离,使得SQL的编写更加灵活...

    hibernate_reference使用指南全

    尽管 Hibernate 支持字段访问和属性访问两种模式,但在实践中通常推荐使用属性访问模式。 - **4.2 实现继承** Hibernate 支持多种继承映射策略,如单表继承、类表继承和子类表继承等。 - **4.3 实现 equals() ...

    spring_struts2_hibernate_mysql集成

    标题中的"spring_struts2_hibernate_mysql集成"指的是在Java Web开发中,将Spring、Struts2、Hibernate这三大主流框架与MySQL数据库进行整合。这是一个常见的企业级应用开发模式,用于构建高效、可维护的Web应用程序...

    JSF+Hibernate_Spring

    它支持多种数据库,提供了事务管理、缓存策略以及对象查询语言(HQL)等功能,极大地提高了开发效率和代码可维护性。 **Spring框架** 是企业级Java应用的基石,它提供了全面的基础设施支持,包括依赖注入、面向切面...

    Hibernate_二级缓存总结

    Hibernate支持多种二级缓存实现,如EhCache、JBossCache和OsCache等。二级缓存主要用于存储实体对象,提高了数据检索的效率。 **3. QueryCache** QueryCache是Hibernate的另一种缓存机制,用于缓存查询语句及其返回...

    first_demo.rar_DEMO_struts2_struts2 hibernate_简历

    标题中的"first_demo.rar_DEMO_struts2_struts2_hibernate_简历"表明这是一个关于使用Struts2和Hibernate框架开发的初级示例项目,主要功能是实现简历的创建、查看、编辑和删除操作。这个DEMO是针对初学者或者开发者...

    SSH.rar_s2sh_ssh struts2_ssh+mysql_struts2 hibernate_struts2 mys

    Hibernate支持多种数据库,包括MySQL,且具备丰富的查询API和HQL(Hibernate Query Language),使得数据操作更加灵活。 至于MySQL,它是世界上最流行的开源关系型数据库管理系统之一。其特点是速度快、稳定性和可...

    hibernate_reference.pdf

    本文档名为“hibernate_reference.pdf”,其描述表明它是一份与“JSR 303 Reference Implementation Reference Guide 4.0.1.GA”相关的指南,重点介绍Hibernate Validator作为JSR 303的参考实现。JSR 303是Java社区...

    eclipse_struts_hibernate_spring集成开发宝典 blog.rar

    Hibernate支持多种数据库,并且提供了缓存机制以提升性能。 Spring框架是Java企业级应用的核心框架,它提供了依赖注入(DI)和面向切面编程(AOP)等功能,使得代码更加模块化,易于测试和维护。Spring还包含了数据...

    struts_hibernate_spring中文文档

    Hibernate支持多种数据源,具有事务管理、缓存机制等功能。 **Spring** 是一个全面的企业级应用框架,它不仅包含IoC(Inversion of Control,控制反转)和AOP(Aspect-Oriented Programming,面向切面编程)等核心...

    hibernate_1

    Hibernate支持多种查询方式,包括HQL(Hibernate Query Language)和 Criteria API。HQL是面向对象的查询语言,类似于SQL但操作对象而非记录。Criteria API则提供了一种更加面向对象的查询方式,无需编写字符串查询...

    hibernate_validator 官方参考文档

    Hibernate Validator不仅仅是一个遵循JSR 303规范的实现,它还引入了一些额外的功能,如fail-fast模式,可以提前终止验证过程,节省资源;方法级验证,允许对方法参数进行约束检查;以及程序化约束定义,为那些无法...

    Struts2_Hibernate_Spring基础教程

    **Struts2** 是一个基于MVC(Model-View-Controller)设计模式的Java Web框架,主要用于处理用户请求和控制应用程序流程。它通过Action类来接收和处理HTTP请求,并将结果转发给视图层进行展示。Struts2提供了丰富的...

    struts_spring_hibernate_extjs4_笔记

    Struts2相比Servlet提供了更灵活和易用的控制层,如通过注解方式配置Action,以及强大的拦截器机制,支持多种结果类型(JSP、FreeMarker、Velocity等)。 【Hibernate配置】 Hibernate是一个持久化框架,它简化了...

    基于Spring_Hibernate_Flex架构的教学资源库设计与实现

    本文将介绍如何基于Spring、Hibernate和Flex这三个开源框架整合出一个新的Web应用开发模型,用于构建教学资源库系统。 #### 二、系统技术架构设计 ##### 2.1 数据库设计 系统采用了MySQL作为数据库管理系统。...

Global site tag (gtag.js) - Google Analytics