`
独立与自由
  • 浏览: 11833 次
社区版块
存档分类
最新评论

Hibernate的各种查询

 
阅读更多

命名查询

 

将hql语句放在映射文件的<hibernate-mapping.../>中,而不是代码中,就像这样:

 

 

<!--定义命名查询-->
<query name="myNamedQuery">
		from Person as p where p.age > ?
</query>

 

 

执行命名查询:

 

 

//执行命名查询
List pl = sess.getNamedQuery("myNamedQuery")
//根据HQL语句里参数索引为参数赋值
		.setInteger(0 , 20)
		.list();

 

 

条件查询

 

 

//打开Session和事务
Session session = HibernateUtil.currentSession();
Transaction tx = session.beginTransaction();
//使用createCriteria开始条件查询
List l = session.createCriteria(Student.class)
		//根据Student的属性进行过滤数据
		.add( Restrictions.gt("name" , "a"))
		.list();

 根据关联实体的属性过滤数据:

 

 

//打开Session和事务
Session session = HibernateUtil.currentSession();
Transaction tx = session.beginTransaction();
//使用createCriteria开始条件查询
List l = session.createCriteria(Student.class)
		//此处增加限制条件必须是Student已经存在的属性
		.add( Restrictions.gt("studentNumber" , 20050231L))
		//如果要增加对Student的关联类的属性的限制
		//则必须重新createCriteria()
		//如果此关联属性是集合,则只要集合里任意一个对象的属性满足下面条件即可
		.createCriteria("enrolments")
		.add( Restrictions.gt("semester" , 2))
                //该方法并不是创建一个新的Criteria实例,它只是该关联实体起一个别名
//		.createAlias("enrolments", "en")
//		.add( Restrictions.gt("en.semester" , 2))
		.list();

 

命名查询时同时改变延迟加载策略:

 

 

通常在映射文件中指定延迟加载,如果想在查询中改变延迟加载策略可以这样:

 

//使用createCriteria开始条件查询
List l = session.createCriteria(Student.class)
		//此处增加限制条件必须是Student已经存在的属性
		.add( Restrictions.gt("studentNumber" , 20050231L))
                //同时初始化Student关联的enrolments对象
		.setFetchMode("enrolments", FetchMode.JOIN)
		.list();

 

投影、聚合、分组

 

 

//打开Session和事务
Session session = HibernateUtil.currentSession();
Transaction tx = session.beginTransaction();
//使用createCriteria开始条件查询
List l = session.createCriteria(Enrolment.class)
			.createAlias("student", "s")
			.setProjection(Projections.projectionList()
				//统计记录条数
				.add(Projections.rowCount())
				//统计选择该课程里最大的学生姓名
				.add(Projections.max("s.name"))
				//按course进行分组
				.add(Projections.groupProperty("course"))
			).list();

 

//------指定别名-----
List l = session.createCriteria(Enrolment.class)
                .setProjection(Projections.projectionList()
		//按course进行分组
		.add(Projections.groupProperty("course"))
		//统计记录条数,并为统计结果指定别名c
		.add(Projections.alias(Projections.rowCount(), "c")))
		.addOrder(Order.asc("c"))
		.list();

 

List l = session.createCriteria(Enrolment.class)
			.setProjection(Projections.projectionList()
			//按course进行分组
			.add(Projections.groupProperty("course").as("c"))
			//统计记录条数,并为统计结果指定别名c
			.add(Projections.rowCount()))
			.addOrder(Order.asc("c"))
			.list();

 

//使用Property只选出指定列
List l = session.createCriteria(Student.class)
			.setProjection(Property.forName("name"))
			.list();

 

//------指定别名-----
List l = session.createCriteria(Enrolment.class)
			.setProjection(Projections.projectionList()
			//按course进行分组,指定别名为c
			.add(Projections.groupProperty("course") , "c")
			//统计每组记录的条数,指定别名为rc
			.add(Projections.rowCount(), "rc"))
			.addOrder(Order.asc("rc"))
			.list();

 根据指定列过滤数据:

//使用Property选出指定列,并根据指定列过滤数据
List l = session.createCriteria(Enrolment.class)
		.createAlias("student", "s")
		.setProjection(Projections.projectionList()
		.add(Property.forName("course"))
		.add(Property.forName("s.name")))
		.add(Property.forName("s.name").eq("孙悟空"))
		.list();

 

离线查询和子查询

 

//定义一个离线查询
DetachedCriteria query = DetachedCriteria
			.forClass(Student.class)
			.setProjection(Property.forName("name"));
//打开Session和事务
Session session = HibernateUtil.currentSession();
Transaction tx = session.beginTransaction();
//执行离线查询
List l = query.getExecutableCriteria(session)
		.list();

 子查询:

//定义一个离线查询
DetachedCriteria subQuery = DetachedCriteria
			.forClass(Student.class)
			.setProjection(Property.forName("name"));
//打开Session和事务
Session session = HibernateUtil.currentSession();
Transaction tx = session.beginTransaction();
//执行子查询
List l = session.createCriteria(Student.class)
		.add( Property.forName("name").in(subQuery))
		.list();

 

SQL查询

 

标量查询:

 

//打开Session和事务
Session session = HibernateUtil.currentSession();
Transaction tx = session.beginTransaction();
String sqlString = "select stu.* from student_inf as stu";
List l = session.createSQLQuery(sqlString)
		//指定查询name和student_id两个数据列,指定返回值类型
		.addScalar("name" , StandardBasicTypes.STRING)
		.addScalar("student_id" , StandardBasicTypes.INTEGER)
		//返回标量值列表
		.list();

 

实体查询:

将查询结果转换为实体:

//打开Session和事务
Session session = HibernateUtil.currentSession();
Transaction tx = session.beginTransaction();
String sqlString = "select * from enrolment_inf where year=:year";
List l = session.createSQLQuery(sqlString)
			//指定将查询的记录行转换成Enrolment实体
			.addEntity(Enrolment.class)
			//为SQL字符串的参数设置值
			.setInteger("year" , 2005)
			.list();

 

将查询结果转换为多个实体:

 

//打开Session和事务
Session session = HibernateUtil.currentSession();
Transaction tx = session.beginTransaction();
String sqlString = "select s.*,e.*,c.* "
		+ "from student_inf s,enrolment_inf e,course_inf c "
		+ "where s.student_id = e.student_id "
		+ "and e.course_code = c.course_code";
List l = session.createSQLQuery(sqlString)
		//指定将查询的记录行转换成Student实体
		.addEntity("s", Student.class)
		.addEntity("e", Enrolment.class)
		.addEntity("c", Course.class)
		.list();

 

将结果转换为JavaBean:

 

//打开Session和事务
Session session = HibernateUtil.currentSession();
Transaction tx = session.beginTransaction();
String sqlString = "select s.name stuName, c.name courseName "
		+ "from student_inf s,enrolment_inf e,course_inf c "
		+ "where s.student_id = e.student_id "
		+ "and e.course_code = c.course_code ";
List l = session.createSQLQuery(sqlString)
		//指定将查询的记录行转换成StudentCourse对象
		.setResultTransformer(Transformers
		.aliasToBean(StudentCourse.class))
		.list();

 

public class StudentCourse
{
	private String stuName;
	private String courseName;

	//stuName属性的setter和getter方法
	public void setStuName(String stuName)
	{
		this.stuName = stuName;
	}
	public String getStuName()
	{
		return this.stuName;
	}

	//courseName属性的setter和getter方法
	public void setCourseName(String courseName)
	{
		this.courseName = courseName;
	}
	public String getCourseName()
	{
		return this.courseName;
	}
}

 关联查询:

//打开Session和事务
Session session = HibernateUtil.currentSession();
Transaction tx = session.beginTransaction();
String sqlString = "select s.* , e.* from student_inf s , "
		+ "enrolment_inf e where s.student_id=e.student_id";
List l = session.createSQLQuery(sqlString)
		.addEntity("s", Student.class)
                //将s.enrolments属性转换为别名为e的实体
		.addJoin("e" , "s.enrolments")
		.list();

 

 SQL命名查询

 

与上边命名查询相似(在映射文件的<hibernate-mapping../>中):

 

<!-- 指定SQL查询的名称为queryTest -->
<sql-query name="queryTest">
	<!-- 将s别名转换成Student实体 -->
	<return alias="s" class="Student"/>
	<!-- 将e别名转换成Enrolment实体 -->
	<return alias="e" class="Enrolment"/>
	<!-- 预初始化e的course属性(关联实体) -->
	<return-join alias="c" property="e.course"/>
	<!-- 指定将student表的name列作为标量值返回 -->
	<return-scalar column="s.name" type="string"/>
		select s.*,e.*,c.* 
		from student_inf s,enrolment_inf e,course_inf c 
		where s.student_id = e.student_id 
		and e.course_code = c.course_code
		and e.year=:targetYear
</sql-query>

 

//打开Session和事务
Session session = HibernateUtil.currentSession();
Transaction tx = session.beginTransaction();
//调用命名查询,直接返回结果
List l = session.getNamedQuery("queryTest")
		.setInteger("targetYear" , 2005)
		.list();

 

 调用存储过程:

 

先在mysql创建一个存储过程:

create procedure select_all_student()
select *
from student_inf;

 在映射文件<hibernate-mapping.../>:

<!-- 定义一个调用存储过程的命名SQL查询 -->
<sql-query name="callProcedure" callable="true">
	<!-- 将查询结果转换成Student实体 -->
	<return class="Student">
		<!-- 将查询的数据列转换成实体的属性 -->
		<return-property name="studentNumber"
			column="student_id"/>
		<return-property name="name" column="name"/>
	</return>
	{call select_all_student()}
</sql-query>

 

//调用存储过程
private void callProcedure()
{
	//打开Session和事务
	Session session = HibernateUtil.currentSession();
	Transaction tx = session.beginTransaction();
	//调用命名查询,直接返回结果
	List l = session.getNamedQuery("callProcedure")
		.list();
	tx.commit();
        ....
}

 

定制SQL

 

默认通过一套固定的sql语句来完成一些功能

 

<loader query-ref="new_loader"/>
<sql-insert>insert into news_inf
	(title, content) values(upper(?), ?)</sql-insert>
<sql-update>update news_inf 
	set title=upper(?),content=? where id=?</sql-update>
<sql-delete>delete from news_table where id=?</sql-delete>

 

分享到:
评论

相关推荐

    Hibernate连表查询 Hibernate连表查询

    根据提供的文件信息,我们可以深入探讨Hibernate中的连表查询方法及其应用。下面将详细介绍与标题、描述及部分代码相关的几个核心知识点: ### Hibernate 连表查询基础 Hibernate 是一个开源的对象关系映射(ORM)...

    Hibernate分页查询小结

    Hibernate分页查询小结

    hibernate多表联合查询

    ### Hibernate多表联合查询详解 #### 一、引言 在实际项目开发中,我们经常需要处理复杂的数据库查询,特别是涉及到多个表之间的关联查询。Hibernate作为一款流行的Java持久层框架,提供了一种非常便捷的方式来处理...

    hibernate 模糊查询 分页

    本篇文章将深入探讨如何使用Hibernate实现模糊查询和分页功能,这对于任何需要处理大量数据的应用程序来说都是至关重要的技能。 首先,让我们了解Hibernate的核心概念。Hibernate是一个开源的JPA(Java Persistence...

    Hibernate分页查询原理解读

    ### Hibernate 分页查询原理详解 #### 一、引言 在大数据量处理场景下,分页查询是提高数据检索效率的重要手段之一。Hibernate作为Java领域内最常用的持久层框架之一,其内置的分页功能非常实用且高效。本文将深入...

    hibernate实现动态SQL查询

    本篇文章主要探讨如何利用Hibernate实现动态SQL查询,结合XML配置和FREEMARKER模板引擎来生成执行的SQL语句。 一、Hibernate简介 Hibernate作为一款强大的持久层框架,它简化了Java应用程序与数据库之间的交互。...

    通用的hibernate查询

    【hibernate查询详解】 Hibernate,作为一款强大的Java对象关系映射(ORM)框架,极大地简化了数据库操作。它允许开发者使用面向对象的方式来处理数据库,从而避免了传统的JDBC编码方式带来的复杂性。本篇文章将...

    Hibernate_query查询数据表中的一个字段.

    Hibernate提供了一种灵活的查询语言——HQL(Hibernate Query Language),以及 Criteria 查询和 Criteria API,它们都可以用来获取数据表中的特定字段。 二、Hibernate配置 在使用Hibernate进行查询前,首先需要...

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

    当我们需要执行一些特殊的、复杂的或者非标准的SQL查询时, Hibernate的本地SQL查询功能就显得尤为实用。本文将深入探讨如何使用Hibernate将本地SQL查询的结果封装成对象。 首先,本地SQL查询(Native SQL)是指...

    hibernate自定义查询

    Hibernate是一款强大的对象关系映射(ORM)框架,它允许开发者使用...以上就是关于Hibernate自定义查询的主要知识点,理解并熟练运用这些技术,可以提升你在数据库操作方面的专业素养,更好地应对各种复杂的业务需求。

    Hibernate的MySql查询.rar

    本文将深入探讨在使用Hibernate进行MySQL查询时的一些关键知识点,以帮助开发者更好地理解和应用这些技术。 首先,我们需要理解Hibernate的核心概念。Hibernate通过提供一个中间层,将Java对象与数据库表进行映射,...

    hibernate关联查询 实例源码

    hibernate关联查询 实例源码 java web 如果不明白hibernate关联查询不明白的可以看看,保证马上学会,注释,数据库都有,很简单易学的源码,谢谢下载!

    hibernate子查询

    在使用Hibernate进行数据查询时,有时会遇到需要使用子查询的情况。然而,正如你所描述的,Hibernate的HQL(Hibernate Query Language)并不直接支持在`FROM`子句后跟一个子查询,这与标准的SQL语法有所差异。在HQL...

    hibernate的多态查询

    标题“hibernate的多态查询”指的是在Hibernate框架中,如何进行涉及不同子类的对象查询,这是ORM(对象关系映射)中的一个重要特性,旨在提高代码的灵活性和可扩展性。多态查询允许我们编写一次查询,而无需关心...

    hibernate 级联查询

    “Hibernate 级联查询”是指在使用Hibernate这个Java持久化框架时,如何处理对象之间的关联查询。Hibernate提供了级联操作来简化数据的保存、更新和删除等操作,使得开发者无需手动编写复杂的SQL语句,就能实现关联...

    Hibernate中查询语句

    Hibernate中的查询方法若HQL,详细讲解HQL与使用的具体例子

    hibernate里面的 两种查询

    - **基本操作**:Criteria查询可以通过DetachedCriteria创建,然后添加各种限制条件,如Restrictions.eq()用于等于,gt()用于大于等。还可以通过Projections获取特定的查询结果,如sum()、count()等。Order类用于...

    hibernate查询代码

    最后,`hibernate查询`这个压缩包可能包含了一些示例代码和配置文件,用于演示如何在Java项目中实现上述查询方式。通过分析这些文件,你可以更好地理解Hibernate查询的工作原理,并将其应用到自己的项目中。 总之,...

    Hibernate查询练习小例子

    利用MYSQL数据库提供的样例数据库world建立的查询小例子。已经建立好了数据库对应的...本项目主要是为了练习使用Hibernate查询数据库。如果有什么问题可以发站内信或者邮件asddf14@hotmail.com。我会尽量解答一下~~~

    struts+hibernate查询所有记录

    ### Struts+Hibernate查询所有记录 #### 一、概述 在Java Web开发中,Struts与Hibernate是非常流行的框架组合,用于构建复杂的企业级应用。本文将详细介绍如何利用Struts和Hibernate来实现对Oracle数据库中所有...

Global site tag (gtag.js) - Google Analytics