命名查询:
将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 是一个开源的对象关系映射(ORM)...
Hibernate分页查询小结
### Hibernate多表联合查询详解 #### 一、引言 在实际项目开发中,我们经常需要处理复杂的数据库查询,特别是涉及到多个表之间的关联查询。Hibernate作为一款流行的Java持久层框架,提供了一种非常便捷的方式来处理...
本篇文章将深入探讨如何使用Hibernate实现模糊查询和分页功能,这对于任何需要处理大量数据的应用程序来说都是至关重要的技能。 首先,让我们了解Hibernate的核心概念。Hibernate是一个开源的JPA(Java Persistence...
### Hibernate 分页查询原理详解 #### 一、引言 在大数据量处理场景下,分页查询是提高数据检索效率的重要手段之一。Hibernate作为Java领域内最常用的持久层框架之一,其内置的分页功能非常实用且高效。本文将深入...
本篇文章主要探讨如何利用Hibernate实现动态SQL查询,结合XML配置和FREEMARKER模板引擎来生成执行的SQL语句。 一、Hibernate简介 Hibernate作为一款强大的持久层框架,它简化了Java应用程序与数据库之间的交互。...
【hibernate查询详解】 Hibernate,作为一款强大的Java对象关系映射(ORM)框架,极大地简化了数据库操作。它允许开发者使用面向对象的方式来处理数据库,从而避免了传统的JDBC编码方式带来的复杂性。本篇文章将...
Hibernate提供了一种灵活的查询语言——HQL(Hibernate Query Language),以及 Criteria 查询和 Criteria API,它们都可以用来获取数据表中的特定字段。 二、Hibernate配置 在使用Hibernate进行查询前,首先需要...
当我们需要执行一些特殊的、复杂的或者非标准的SQL查询时, Hibernate的本地SQL查询功能就显得尤为实用。本文将深入探讨如何使用Hibernate将本地SQL查询的结果封装成对象。 首先,本地SQL查询(Native SQL)是指...
Hibernate是一款强大的对象关系映射(ORM)框架,它允许开发者使用...以上就是关于Hibernate自定义查询的主要知识点,理解并熟练运用这些技术,可以提升你在数据库操作方面的专业素养,更好地应对各种复杂的业务需求。
本文将深入探讨在使用Hibernate进行MySQL查询时的一些关键知识点,以帮助开发者更好地理解和应用这些技术。 首先,我们需要理解Hibernate的核心概念。Hibernate通过提供一个中间层,将Java对象与数据库表进行映射,...
hibernate关联查询 实例源码 java web 如果不明白hibernate关联查询不明白的可以看看,保证马上学会,注释,数据库都有,很简单易学的源码,谢谢下载!
在使用Hibernate进行数据查询时,有时会遇到需要使用子查询的情况。然而,正如你所描述的,Hibernate的HQL(Hibernate Query Language)并不直接支持在`FROM`子句后跟一个子查询,这与标准的SQL语法有所差异。在HQL...
标题“hibernate的多态查询”指的是在Hibernate框架中,如何进行涉及不同子类的对象查询,这是ORM(对象关系映射)中的一个重要特性,旨在提高代码的灵活性和可扩展性。多态查询允许我们编写一次查询,而无需关心...
“Hibernate 级联查询”是指在使用Hibernate这个Java持久化框架时,如何处理对象之间的关联查询。Hibernate提供了级联操作来简化数据的保存、更新和删除等操作,使得开发者无需手动编写复杂的SQL语句,就能实现关联...
Hibernate中的查询方法若HQL,详细讲解HQL与使用的具体例子
- **基本操作**:Criteria查询可以通过DetachedCriteria创建,然后添加各种限制条件,如Restrictions.eq()用于等于,gt()用于大于等。还可以通过Projections获取特定的查询结果,如sum()、count()等。Order类用于...
最后,`hibernate查询`这个压缩包可能包含了一些示例代码和配置文件,用于演示如何在Java项目中实现上述查询方式。通过分析这些文件,你可以更好地理解Hibernate查询的工作原理,并将其应用到自己的项目中。 总之,...
利用MYSQL数据库提供的样例数据库world建立的查询小例子。已经建立好了数据库对应的...本项目主要是为了练习使用Hibernate查询数据库。如果有什么问题可以发站内信或者邮件asddf14@hotmail.com。我会尽量解答一下~~~
### Struts+Hibernate查询所有记录 #### 一、概述 在Java Web开发中,Struts与Hibernate是非常流行的框架组合,用于构建复杂的企业级应用。本文将详细介绍如何利用Struts和Hibernate来实现对Oracle数据库中所有...