HQL使用说明以及各种绑定参数的用法

合集下载

HQL使用技术

HQL使用技术

第三章HQL使用技术1.Hibernate支持两种主要的查询方式:HQL(Hibernate Query Language,Hibernate查询语言)查询和Criteria 查询。

1)HQL是一种面向对象的查询语言,其中没有表和字段的概念,只有类和属性的概念2)Criteria查询又称为“对象查询”,它用面向对象的方式将构造查询的过程做了封装。

2.使用HQL可以避免使用JDBC查询的一些弊端1)不需要再编写繁复的SQL 语句,针对实体类及其属性进行查询2)查询结果是直接存放在List 中的对象,不需要再次封装3)独立于数据库,对不同的数据库根据Hibernate dialect 属性的配置自动生成不同的SQL 语句执行[select/update/delete……] from Entity [where……] [group by……] [having……] [order by……]3.使用HQL查询语言1)得到Session2)编写HQL语句3)创建Query对象Query是HQL查询接口它提供了各种查询功能4)执行查询,得到结果实例:Configuration conf=null;SessionFactory sessionFatory=null;Session session=null;try {sessionFactory=newConfiguration().configure().buildSes sion;session = sessionFactory.openSession();String hql = “from Street”;Query query = session.createQuery(hql);List<Street> list = query.list();for(Street street:list){System.out.println("街道名称" +street.getDistrict().getName()+"区"+street.getName());}} catch (HibernateException e) {e.printStackTrace();} finally{// 省略部分代码}其中“from Street”中可以写类名也可以写类的完全限定名“from cn.jbit.houserent.been.Street”相同。

HQL数据库操作

HQL数据库操作

HQL数据库操作Hive Query Language(HQL)是一种类似于SQL的查询语言,用于在Hive中对数据进行处理和分析。

Hive是建立在Hadoop之上的一个数据仓库工具,可以将结构化的数据映射到分布式存储中,并提供高级查询和分析功能。

HQL支持类似SQL的语法,并且增加了一些特定于Hive的功能。

下面将介绍HQL的一些常用数据库操作。

1.创建数据库(CREATEDATABASE)使用CREATE DATABASE语句可以在Hive中创建一个新的数据库。

语法如下:```CREATE DATABASE database_name;```2.切换数据库(USE)使用USE语句可以在Hive中切换当前活动的数据库。

语法如下:```USE database_name;```3.创建表(CREATETABLE)使用CREATE TABLE语句可以在Hive中创建一个新表。

语法如下:```CREATE TABLE table_namecolumn1 data_type,column2 data_type,...ROW FORMAT delimitedFIELDSTERMINATEDBY','STORED AS textfile;```其中,`table_name`是表的名称,`column1, column2, ...`是表的列名和数据类型。

4.插入数据(INSERTINTO)使用INSERT INTO语句可以向Hive中的表中插入数据。

语法如下:```INSERT INTO TABLE table_nameVALUES (value1, value2, ...);```其中,`table_name`是表的名称,`value1, value2, ...`是要插入的数据。

5.查询数据(SELECT)使用SELECT语句可以从Hive中的表中查询数据。

语法如下:```SELECT column1, column2, ...FROM table_nameWHERE conditions;```其中,`column1, column2, ...`是要查询的列,`table_name`是要查询的表,`conditions`是查询的条件。

HQL使用说明以及各种绑定参数的用法

HQL使用说明以及各种绑定参数的用法

HQL使用说明以及各种绑定参数的用法Hive Query Language(HQL)是用于在Hadoop上运行的Hive数据仓库中进行数据查询和分析的语言。

HQL类似于SQL,但具有一些特定的语法和功能。

本文将介绍HQL的基本使用说明以及各种绑定参数的用法。

HQL基本用法:HQL中的语句由多个子句组成,包括SELECT、FROM、WHERE、GROUPBY、HAVING和ORDERBY等。

以下是HQL的基本用法示例:```SELECT column1, column2, ...FROM table1[JOIN table2 ON condition]WHERE conditionGROUP BY column1, column2, ...HAVING conditionORDER BY column1, column2, ...```在这个示例中,您可以指定要查询的列、要查询的表、连接条件、筛选条件、分组条件、筛选分组后的结果以及排序顺序。

HQL执行后,您将获得满足条件的结果集。

HQL绑定参数的用法:HQL支持使用绑定参数来动态地传递值或表达式。

绑定参数以冒号(:)开头,后面跟着参数名称。

以下是HQL中绑定参数的用法示例:```SELECT column1, column2, ...FROM table1WHERE column1 = :parameter1```在这个示例中,使用了一个名为parameter1的绑定参数来指定查询条件。

在执行HQL语句之前,需要通过传递参数值来设置绑定参数的值。

绑定参数的设置有以下几种方式:1.在程序中直接设置绑定参数的值:```Query query = session.createQuery(hql);query.setParameter("parameter1", value);```2.在程序中通过命名参数查询方式设置绑定参数的值:```Query query = session.getNamedQuery("queryName");query.setParameter(0, value);```3.在程序中通过位置参数查询方式设置绑定参数的值:```Query query = session.createQuery(hql);query.setParameter(0, value);```绑定参数的用法可以有效地防止SQL注入攻击,同时也增加了查询的灵活性和可维护性。

hql语法

hql语法

hql语法HQL(Hibernate Query Language)是Hibernate框架提供的一种面向对象的查询语言,它类似于SQL,但是是针对对象进行查询的,而不是针对数据表操作的。

HQL语法非常类似于SQL语法,只不过它是面向对象的查询语言。

以下是一些常用的HQL语法,在此进行详细介绍。

1. 查询所有数据HQL语句:from 实体类对象说明:使用from关键字可以查询指定实体类所有记录,这里的实体类是指映射到数据库表的Java类,实体类对象是Java类的实例化对象。

例如:from Employee说明:查询Employee表的所有记录。

说明:使用where子句可以指定查询条件,属性名称是指实体类中的某个属性名,属性值是指该属性所对应的值。

3. 查询满足多个条件的数据HQL语句:from 实体类对象 where 属性名称1=属性值1 and 属性名称2=属性值2说明:使用and关键字可以同时指定多个查询条件。

from Employee where name='Tom' and age=254. 查询包含某个值的数据说明:使用like关键字可以查询包含某个值的记录,%表示任意字符。

5. 查询指定字段数据6. 使用聚集函数查询说明:使用聚集函数可以进行统计查询。

7. 连接查询说明:使用join可以进行连接查询,使用on子句指定连接条件。

from Employee e inner join e.department d on e.departmentId=d.id8. 分组查询9. 排序查询说明:使用order by进行排序查询,可以指定升序或降序,默认为升序。

综上所述,HQL语法与SQL语法相似,可以使用各种关键字进行高级查询,对查询结果进行聚合计算、排序、分组、分页等各种操作,可满足日常开发中绝大部分查询需求。

HQL连接查询和注解

HQL连接查询和注解

HQL连接查询和注解HQL连接查询和注解⼀:HQL连接查询1. 各种连接查询:内连接:inner join或joinFrom Entity inner [inner] join [fetch] Entity.property;左外连接:left outer join或left joinFrom Entity left[outer] join [fetch] Entity.property;迫切左外连接:left outer join fetch或left join fetch右外连接:right outer join或right join迫切连接:inner join fetch或join fetch注:迫切连接要使⽤对象连接,不然的话会出错。

等值连接:From Dept d,Emp p where d=e.dept;1. 聚合函数select count(*),sum(sal),min(sal),max(sal),avg(sal)from Emp;List<Object[]>list=query.list();for (Object[] o:list) {System.out.println("总:"+o[0]+"和:"+o[1]+"最⼩值:"+o[2]+"最⼤值:"+o[3]+"平均数:"+o[4]); }//省略其它代码按职位统计员⼯个数:select e.job,count(*) from Emp e group by e.job统计每个部门下的员⼯个数并且⼤于2的显⽰输出:select e.job,count(*) from Emp e group by e.job having count(*)>2;1. ⼦查询关键字:all:⼦查询返回所有记录。

any:⼦查询返回的任意的⼀条记录。

hql语句

hql语句

hql语句什么是HQL呢?HQL是Hibernate Query Language的缩写,提供更加丰富灵活、更为强大的查询能力;HQL更接近SQL语句查询语法。

同时也提供了更加面向对象的封装。

完整的HQL语句形势如下:Select/update/delete……from …… where …… group by …… having …… order by …… asc/desc 非常类似标准的SQL语句。

1、实体查询:String hql ="from Customer c";List<Customer> list = session.createQuery(hql).list();可以看到所有的关联信息全部查出来了。

上面的代码执行结果是,查询出Customer实体对象所对应的所有数据,而且将数据封装成Admin实体对象,并且放入list中返回。

因为HQL语句与标准SQL语句相似,所以我们也可以在HQL 语句中使用where字句,并且可以在where字句中使用各种表达式,比较操作符以及使用“and”,”or”连接不同的查询条件的组合。

看下面的一些简单的例子:fromUseruserwhereuser.age=20;fromUseruserwhereuser.age between20and30;fromUseruserwhereuser.agein(20,30);isnull; like‘%zx%’;fromUseruserwhere(user.age%2)=1;fromUseruserw hereuser.age= like ‘%zx%’;2.实体的更新与删除如果我们想将数据库中所有18岁的用户的年龄全部改为20岁,那么我们要首先将年龄在18岁的用户检索出来,然后将他们的年龄修改为20岁,最后调用Session.update()语句进行更新。

如下面的代码:Transaction trans=session.beginTransaction();String hql=”update User user set user.age=20 where user.age=18”;Query queryupdate=session.createQuery(hql);intret=queryupdate.executeUpdate();trans.mit();3. 属性查询很多时候我们在检索数据时,并不需要获得实体对象所对应的全部数据,而只需要检索实体对象的部分属性所对应的数据。

hibernatehql语句详解

hibernatehql语句详解

hibernatehql语句详解Hibernate HQL语句详解1. 什么是Hibernate HQL语句?Hibernate HQL(Hibernate Query Language)是Hibernate框架提供的一种面向对象的查询语言。

它类似于SQL,但是更注重于面向对象的概念和操作。

2. HQL语句的基本语法•HQL语句以FROM关键字开始,后面跟着要查询的实体类名。

•可以使用SELECT关键字来选择要查询的属性。

•可以使用WHERE关键字来添加查询条件。

•可以使用JOIN关键字来进行表连接查询。

•可以使用ORDER BY关键字来排序查询结果。

•可以使用GROUP BY关键字来进行分组查询。

3. HQL中的参数绑定•HQL语句中可以使用占位符(?)来表示参数,然后使用setXxx 方法来为占位符绑定实际的值。

•也可以使用命名参数(:name)来表示参数,然后使用setParameter方法来为参数绑定实际的值。

4. HQL中的函数HQL支持多种函数,常用的函数有:•数字函数:abs、sqrt、mod等。

•字符串函数:length、concat、substring等。

•日期函数:year、month、day等。

5. HQL中的聚合函数HQL中支持多种聚合函数,常用的聚合函数有:•avg:计算平均值。

•sum:计算总和。

•max:获取最大值。

•min:获取最小值。

•count:计算记录数。

6. HQL中的子查询•子查询是指一个查询语句内包含另一个查询语句。

•子查询可以用在WHERE子句中的条件表达式中。

•HQL支持分页查询,可以使用setFirstResult和setMaxResults方法来实现分页。

•setFirstResult用于设置查询结果的起始位置。

•setMaxResults用于设置查询结果的最大数量。

8. HQL中的更新和删除操作•HQL不仅可以用于查询,还可以用于更新和删除操作。

第五章 HQL实用技术

第五章 HQL实用技术

第五章实用技术5.1使用HQL查询语句一、Hibernate支持哪三种查询方式?二、HQL语句中除了和外,区分大小写。

1. from 子句举例P1402. select子句用于。

3. where子句用于。

4.使用表达式5. order by子句三、如何执行HQL语句1.声明变量并初始化String hql=”from Emp”;2. 构建Query对象Query query=session.createQuery(hql);Query对象构建好以后,执行查询语句,并获取查询结果。

有两种方式执行查询,一种是Query对象的list()方法,另一种是Query对象的iterator()方法。

示例1:(1)使用list()方法执行查询,并输出结果import java.util.List;import org.hibernate.HibernateException;import org.hibernate.Query;import org.hibernate.Session;import org.hibernate.SessionFactory;import org.hibernate.Transaction;import org.hibernate.cfg.Configuration;publicclass test {/*** @param args*/publicstaticvoid main(String[] args) {Configuration conf = null;SessionFactory sessionFactory = null;Session session = null;try {// 1.读取配置文件conf = new Configuration().configure();// 2.创建SessionFactorysessionFactory = conf.buildSessionFactory();// 3. 打开sessionsession = sessionFactory.openSession();// 声明变量并初始化String hql = "from Emp";// 构建query对象Query query = session.createQuery(hql);// 执行查询List<Emp> empList = query.list();// 遍历并输出结果for (Emp emp : empList) {System.out.println("员工姓名:" + emp.getEmpName());}} catch (Exception e) {e.printStackTrace();} finally {// 7. 关闭sessionif (session != null)session.close();}}}List()方法生成一条SQL查询语句,查询所有符合条件的记录(2)使用iterator()方法执行查询修改以上代码如下import java.util.Iterator;// 执行查询Iterator<Emp> empIterator = query.iterate();// 声明变量Emp emp = null;// 遍历并输出结果while (empIterator.hasNext()) {// 为变量赋值emp = empIterator.next();System.out.println("员工姓名:" + emp.getEmpName());}Iterator()方法首先查询所有符合条件的主键值,此处是empno,然后在需要某一对象的其他属性值时,才生成按主键查询的SQL语句,此处是selectemp0_.empno as empno1_0_,emp0_.ename as ename1_0_,emp0_.job as job1_0_,emp0_.sal as sal1_0_,emp0_.hireDate as hireDate1_0_fromscott.emp emp0_whereemp0_.empno=?四、执行HQL语句的步骤1.获取session对象2.编写hql语句3.创建query Query query = session.createQuery(hql);4.执行查询,得到查询结果5.2 在HQL查询语句中绑定参数一、参数绑定形式1. 按参数位置绑定用“?”占位符来定义参数的位置调用setXXX()方法来绑定参数,第一个参数位置为零。

HibernateHQL--实体、属性查询,全参数绑定,引用查询

HibernateHQL--实体、属性查询,全参数绑定,引用查询

是Hibernate官方推荐的查询模式,比Criteria功能更强大。

1)实体查询:出现类名和属性名必须注意大小写区分;当不同路径下存在相同类名,需要写入在hql中写入包名;查询目标实体存在着继承关系,将查询目标的所有子类的库表记录一起返回。

String hql = “from TUser”;Query query = session.createQuery(hql);List list = query.list();2)属性查询:有时页面不需要取整个对象,而只取某个属性。

List list = session.createQuery(“select user.age from TUser user”).list();Iterator it = list.iterator();while(it.hasNext()){//返回的list中,每个条目都是一个对象数组,依次包含我们所获取的数据。

Object[] results = (Object[])it.next();System.out.println(results[0]);System.out.println(results[1]);}注:如果觉得返回数组的方式不够灵活,可以在HQL中构造对象实例。

List list = this.session.createQuery(“select new TUser(,user.age) from TUser user”).list();Iterator it = list.iterator();while(it.hasNext()){TUser user = (TUser)it.next();System.out.println(user.getName());}注:通过HQL动态构造对象实例,此时查询结果中的TUser对象只是一个Java对象,仅用于对查询结果的封装,除了在构造时赋予的属性值之外,其他属性均为未赋值状态,当我们通过session对此对象进行更新,将导致对user对象的数据库插入一条新数据,而不是更新原有对象。

hibernate hql语法

hibernate hql语法

Hibernate HQL(Hibernate Query Language)是Hibernate框架中的一种查询语言,类似于SQL,但它使用的是对象和属性的名称而不是表和列的名称。

HQL提供了丰富的查询语法,用于执行各种数据库操作,如CRUD操作、联接、分组、排序等。

以下是一些HQL的基本语法示例:1. 查询所有实体:java复制代码from EntityName2. 带条件的查询:vbnet复制代码from EntityName where propertyName = 'value'3. 排序查询结果:vbnet复制代码from EntityName order by propertyName asc/desc4. 分组查询结果:vbnet复制代码select propertyName, count(*) from EntityName group by propertyName5. 联接查询:vbnet复制代码select e.propertyName, d.propertyName from EntityName e join e.propertyName d where d.propertyName = 'value'6. 分页查询:java复制代码from EntityName where propertyName = 'value' order by propertyName desc limit 0, 107. 更新实体:sql复制代码update EntityName set propertyName = 'newValue'where propertyName = 'value' 8. 删除实体:sql复制代码delete from EntityName where propertyName = 'value'除了基本的语法外,HQL还支持一些高级特性,如子查询、聚合函数、CASE语句等。

hql语法规则

hql语法规则

HQL是Hibernate Query Language的缩写,是Hibernate框架中使用的一种面向对象的查询语言,用于访问持久化对象的数据库。

以下是HQL的语法规则:
1. 查询语句必须以SELECT开头,后面跟着查询的目标对象或属性。

2. WHERE语句用于指定查询条件,可以使用比较运算符、逻辑运算符等。

3. ORDER BY语句用于对查询结果进行排序。

4. GROUP BY语句用于对查询结果进行分组。

5. HAVING语句用于筛选分组后的结果。

6. JOIN语句用于连接多个表,可以使用INNER JOIN、LEFT JOIN等不同类型的连接。

7. LIMIT语句用于限制查询结果的数量。

8. HQL支持参数化查询,可以使用问号(?)占位符代替具体的值,然后通过setParameter 方法设置参数值。

9. HQL不支持跨数据库的SQL函数和运算符,只能使用Hibernate定义的函数和运算符。

10. HQL查询语句必须符合Java语言的语法规则,可以使用类名、属性名、方法名等Java标识符。

需要注意的是,HQL的语法规则与SQL略有不同,因为HQL是面向对象的查询语言,查询的目标是持久化对象而不是表。

因此,HQL查询语句需要使用对象的属性名称而不是数据库表的列名。

此外,HQL还支持对象关联查询和聚合函数等高级特性,这些都是SQL所不具备的。

hql基本语句教程

hql基本语句教程

hql基本语句教程HQL(Hive Query Language)是Hive中使用的一种类似于SQL 的查询语言,用于对Hive中的数据进行查询和操作。

本文将列举10个基本的HQL语句,帮助读者了解HQL的基本语法和用法。

1. 创建数据库:```CREATE DATABASE mydatabase;```这个语句用于在Hive中创建一个名为mydatabase的数据库。

2. 创建数据表:```CREATE TABLE mytable (id INT, name STRING, age INT);```这个语句用于在Hive中创建一个名为mytable的数据表,包含id、name和age三个列,分别为整型、字符串和整型数据类型。

3. 插入数据:```INSERT INTO mytable VALUES (1, 'Alice', 25), (2, 'Bob', 30);```这个语句用于向mytable表中插入数据,插入两行数据,分别是(1,'Alice', 25)和(2, 'Bob', 30)。

4. 查询数据:```SELECT * FROM mytable;```这个语句用于查询mytable表中的所有数据。

5. 条件查询:```SELECT * FROM mytable WHERE age > 25;```这个语句用于查询mytable表中age大于25的数据。

6. 排序查询:```SELECT * FROM mytable ORDER BY age DESC;```这个语句用于查询mytable表中的数据,并按照age列的降序进行排序。

7. 分组查询:```SELECT age, COUNT(*) FROM mytable GROUP BY age;这个语句用于查询mytable表中按照age列进行分组,并统计每个分组中的数据量。

HQL语句详解

HQL语句详解

HQL语句详解4.3 使用HQL查询Hibernate提供了异常强大的查询体系,使用Hibernate有多种查询方式。

可以选择使用Hibernate的HQL查询,或者使用条件查询,甚至可以使用原生的SQL查询语句,此外还提供了一种数据过滤功能,这些都可用于筛选目标数据。

下面分别介绍Hibernate的4种数据筛选方法:4.3.1 HQL查询HQL是Hibernate Query Language的缩写,HQL的语法很像SQL的语法,但HQL是一种面向对象的查询语言。

因此,SQL的操作对象是数据表和列等数据对象,而HQL的操作对象是类、实例、属性等。

HQL是完全面向对象的查询语言,因此可以支持继承和多态等特征。

HQL查询依赖于Query类,每个Query实例对应一个查询对象。

使用HQL查询可按如下步骤进行:(1)获取Hibernate Session对象;(2)编写HQL语句;(3)以HQL语句作为参数,调用Session的createQuery方法创建查询对象;(4)如果HQL语句包含参数,调用Query的setXxx方法为参数赋值;(5)调用Query对象的list等方法遍历查询结果。

看下面的查询示例:public class HqlQuery{public static void main(String[] args)throws Exception{HqlQuery mgr = new HqlQuery();//调用查询方法mgr.findPersons();//调用第二个查询方法mgr.findPersonsByHappenDate();HibernateUtil.sessionFactory.close();}//第一个查询方法private void findPersons(){//获得Hibernate SessionSession sess = HibernateUtil.currentSession();//开始事务Transaction tx = sess.beginTransaction();//以HQL语句创建Query对象.//执行setString方法为HQL语句的参数赋值//Query调用list方法访问查询的全部实例List pl = sess.createQuery("from Person p where p.myEvents.title= :eventTitle").setString("eventTitle","很普通事情").list();//遍历查询的全部结果for (Iterator pit = pl.iterator() ; pit.hasNext(); ){Person p = ( Person )pit.next();System.out.println(p.getName());}//提交事务mit();HibernateUtil.closeSession();//第二个查询方法private void findPersonsByHappenDate()throws Exception{//获得Hibernate Session对象Session sess = HibernateUtil.currentSession();Transaction tx = sess.beginTransaction();//解析出Date对象SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");Date start = sdf.parse("2005-01-01");System.out.println("系统开始通过日期查找人" + start);//通过Session的createQuery方法创建Query对象//设置参数//返回结果集List pl = sess.createQuery("from Person p where p.myEvents.happenDate between :firstDateand :endDate").setDate("firstDate",start).setDate("endDate",new Date()).list();//遍历结果集for (Iterator pit = pl.iterator() ; pit.hasNext(); ){Person p = ( Person )pit.next();System.out.println(p.getName());}mit();HibernateUtil.closeSession();}通过上面的示例程序,可看出查询步骤基本相似。

HQL数据库操作

HQL数据库操作
2.1 语法
DROP DATABASE[IF EXISTS] database_name [CASCADE];
# cascade 级联删除,当数据库不为空时,使用级联删除
2.2 实例
DROP DATABASE IF EXISTS Employee;
3 修改数据库
3.1 语法
ALTER DATABASE database_name SET DBPROPERTIES (property_name=property_value,...);-- (Note: SCHEMA added in Hive 0.14.0) # 修改数据库的属性设置
ALTER(DATABASE) database_name SET OWNER [USER|ROLE] user_or_role;-- (Note: Hive 0.13.0 and later; SCHEMA added in Hive 0.14.0) # 修改用户名和角色
ALTER(DATABASE) database_name SET LOCATION hdfs_path;-- (Note: Hive 2.2.1, 2.4.0 and later)
[WITH DBPROPERTIES (property_name=property_value,...)];# 指定库的属性信息
1.2 实例
CREATE DATABASE IF NOT EXISTS Employee
COMMENT'this is a employee database';
2 删除数据库# 修改你数来自存放在hdfs的路径3.2 实例
# 修改用户名
ALTER DATABASE users SET OWNER USER jiang;

hql语句

hql语句

另类查询 Hibernate HQL 深度历险传统的SQL语言采用的是结构化的查询方法,而这种方法对于查询以对象形式存在的数据却无能为力。

幸运的是,Hibernate为我们提供了一种语法类似于SQL的语言,Hibernate查询语言(HQL),和SQL不同的是,HQL是一种面向对象的查询语言,它可以查询以对象形式存在的数据。

因此,本文就HQL如何工作以及如何使用HQL展开了深入的讨论。

SQL本身是非常强大的。

当SQL的这种强大和处理面向对象数据的能力相结合时,就产生了HQL。

和SQL一样,HQL提供了丰富的查询功能,如投影查询、聚合函数、分组和约束。

任何复杂的SQL都可以映射成HQL。

本文的第一部分将讨论HQL的简单用法。

第二部分将讨论在HQL中如何根据上下文关系进行查询。

在第三部分将以一个例子来说明如何在实际应用中使用HQL。

进入HQL世界一个ORM框架是建立在面向对象的基础上的。

最好的例子是Hibernate如何提供类SQL 查询。

虽然HQL的语法类似于SQL,但实际上它的查询目标是对象。

HQL拥有面向对象语言的所有的特性,这其中包括多态、继承和组合。

这就相当于一个面向对象的SQL,为了提供更强大的功能,HQL还提供了很多的查询函数。

这些函数可以被分为四类:1.投影函数2.约束函数3.聚合函数4.分组函数使用HQL可以建立简单的查询,也可以建立更复杂的查询。

在本文中并不讨论那些非常复杂的查询,如含有子查询和很多连接的查询。

本文只讨论连接两个表的查询。

现在让我们开始接近HQL吧!投影如谓投影,就是一个可以访问的对象或对象的属性。

在HQL中,可以使用from和select 子句来完成这个工作。

from子句返回指定的类的所有实例。

如from Order将返回Order类的所有实例。

换句话说,以上的查询相当于以下的SQL语句:from 是最简单的查询子句。

from后面可以跟一个或多个类名(类名也可以带有别名)。

HQL 参数绑定 笔记

HQL 参数绑定 笔记

HQL 参数绑定:JDBC 中 :PrepareStatement pre=connection.prepare(“select * from User where =?”);pre.setString(1,”zhaoxin”);ResultSet rs=pre.executeQuery();:如果在 hibernate 中调用 JDBC:trans = session.beginTransaction();Connection conn = session.connection();PreparedStatement stmt = conn.prepareStatement(sql);stmt.executeUpdate();stmt.execute();mit();hibernate 中:A):按照参数名称绑定:// 可以级联的去写Query query = session.createQuery("from User u where = :userName");query.setString("userName","秦强强");//("命名参数名称",命名参数实际的值) // :userName 定义了命名参数,相当于 =?, 然后设置 ? 的值 //B):按照参数位置绑定: // 不提倡可读性差Query query=session.createQuery(“from User user where =? and user.age =? ”);query.setString(0,name);//按照 ? 的位置设置实际的参数query.setInteger(1,age);C):setParameter() 方法://可以绑定任意类型的参数 //推荐String hql=”from User user where =:userName ”;Query query=session.createQuery(hql);query.setParameter(“customername”,name,Hibernate.STRING);//命名参数名称, 命名参数实际值, 命名参数映射类型 ,//对于一些基本类型, hibernate 可以猜测出参数映射类型, 但是Date类型不可以,//应为它会对应hibernate的多种映射类型, 像是Hibernate.DATE, Hibernate.TIMESTAMPD):setProperties() {注意 ies 复数 }方法: //setEntity();将命名参数的值和一个对象的属性值绑定Customer customer=new Customer();customer.setName(“pansl”);customer.setAge(80);Query query=session.createQuery(“from Customer c where =:name and c.age=:age ”);query.setProperties(customer);setProperties()方法会自动将customer对象实例的属性值匹配到命名参数上,但是要求命名参数名称必须要与实体对象相应的属性同名。

HibernateHQL详细教程

HibernateHQL详细教程
HQL,Query 接口实例可以从 Session 对象 session 中生成:
Query query = session.createQuery(“from User u where erName like ?”);
• Query 的主要方法:
right join
• right join返回 ”second_table” 中所有的行尽管 在 ”first_table” 中没有相匹配的数据。
• Hibernate 对应语句:
from Customers as customer right join customer.orders as order
数据加载方式
• 在通过JDBC操作数据时,只能通过SQL语句来加载所 需要的数据 • 由于O-R Mapping的帮助,Hibernate总共有4种数据 加载方式:
–即时加载 –延迟加载 –预先加载 –批量加载
即时加载
• 即时加载:当实体加载完成后,立即加载该实体所关联的数 据。例如:客户和订单之间的一对多关联映射:
executeUpdate()方法
• 该方法用于执行更新或删除语句。常用于批量删除 或批量更新操作。例如:
String hql = "update Book set name = :name where id = :id"; Query query = session.createQuery(hql); query.setString("name","hahahaha"); query.setInteger("id",205); query.executeUpdate();
SQL 中的 on c.id = o.customerid 子句所描述的对应关系在 Hibernate 中已经由 映射文件指定,因此 HQL 并没有对应的子句; 得到的结果集中,每个条目都是一个 Object 数组,其中包含了一个 Customers 对 象与其对应的 Orders 对象

HQL中左连接,右连接,内连接

HQL中左连接,右连接,内连接

HQL中左连接,右连接,内连接左连接:left join如A left join B 即取出A表的所有数据,由on条件关联的B表数据,有则显⽰,没有则为空;右连接:right join如 A right join B 即取出B表的所有数据,由on条件关联的A表数据,有则显⽰,没有则为空;所以:A left join B 与 B right join A 是⼀样的效果内连接:inner joinA inner joinB 表⽰A,B中同时都有的数据才取出来;下⾯是做的⼀个例⼦哈:表group_col:表student_col:下⾯这个图是⽤右连接给显⽰出来的:select stu.*,gr.* from student_col sturight join group_col gr on stu.college_id=gr.id下⾯这个图是⽤左连接给显⽰出来的:select stu.*,gr.* from student_col stuleft join group_col gr on stu.college_id=gr.id内连接就不说了哈:都有数据才显⽰出来,你懂得撒;下⾯介绍⼀特殊的例⼦:(没弄懂上⾯的,不要看下⾯这种哈,免得给弄晕了)student_col表中的外键对应于group_col的主键:select stu.*,gr.* from student_col sturight join group_col gr on stu.college_id=gr.id and gr.id=1前⾯right join 会查出所有的group_col⾥⾯的数据,后⾯的on相当于条件语句,stu.college_id=gr.id 与gr.id=1需要求交集⽽得到的结果当前⾯得到group_col⾥⾯的数据后,把gr.id与student_col中的所有college_id对⽐,有多少相等就把与student_col中的college_id相等的student_col数据给读出来,后⾯⼜有个and gr.id=1条件,所以这⾥对gr.id与student_col中的所有college_id对⽐的时候,gr.id只能为1.因为and是求交集的;显⽰如图:select stu.*,gr.* from student_col sturight join group_col gr on stu.college_id=gr.id where gr.id=1下⾯这种与上⾯不同的是,where是在前⾯已经读出⼀些数据后,经过where条件来筛选。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
1、 实体查询:
有关实体查询技术,其实我们在先前已经有多次涉及,比如下面的例子:
String hql=”from User user ”;
List list=session.CreateQuery(hql).list();
上面的代码执行结果是,查询出User实体对象所对应的所有数据,而且将数据封装成User实体对象,并且放入List中返回。这里需要注意的是,Hibernate的实体查询存在着对继承关系的判定,比如我们前面讨论映射实体继承关系中的Employee实体对象,它有两个子类分别是HourlyEmployee,SalariedEmployee,如果有这样的HQL语句:“from Employee”,当执行检索时Hibernate会检索出所有Employee类型实体对象所对应的数据(包括它的子类HourlyEmployee,SalariedEmployee对应的数据)。
session.saveOrUpdate(user);//这里将会实际执行一个save操作,而不会执行update操作,因为这个User对象的id属性为null,Hibernate会把它作为一个自由对象(请参考持久化对象状态部分的论述),因此会对它执行save操作。
}
4、 分组与排序
* 在hql中可以使用数据库的函数,如:date_format
参见:SimpleConditionQueryTest.java
4、hibernate也支持直接使用sql进行查询
参见:SqlQueryTest.java
5、外置命名查询
* 在映射文件中采用<query>标签来定义hql
System.out.println(user.getAge());
}
这里我们通过动态构造实例对象,对返回结果进行了封装,使我们的程序更加符合面向对象风格,但是这里有一个问题必须注意,那就是这时所返回的User对象,仅仅只是一个普通的Java对象而以,除了查询结果值之外,其它的属性值都为null(包括主键值id),也就是说不能通过Session对象对此对象执行持久化的更新操作。如下面的代码:
A、Order by子句:
与SQL语句相似,HQL查询也可以通过order by子句对查询结果集进行排序,并且可以通过asc或者desc关键字指定排序方式,如下面的代码:
from User user where user.age=20 and like ‘%zx%’;
2、 实体的更新和删除:
在继续讲解HQL其他更为强大的查询功能前,我们先来讲解以下利用HQL进行实体更新和删除的技术。这项技术功能是Hibernate3的新加入的功能,在Hibernate2中是不具备的。比如在Hibernate2中,如果我们想将数据库中所有18岁的用户的年龄全部改为20岁,那么我们要首先将年龄在18岁的用户检索出来,然后将他们的年龄修改为20岁,最后调用Session.update()语句进行更新。在Hibernate3中对这个问题提供了更加灵活和更具效率的解决办法,如下面的代码:
hql HQL查询:
Criteria查询对查询条件进行了面向对象封装,符合编程人员的思维方式,不过HQL(Hibernate Query Language)查询提供了更加丰富的和灵活的查询特性,因此Hibernate将HQL查询方式立为官方推荐的标准查询方式,HQL查询在涵盖Criteria查询的所有功能的前提下,提供了类似标准SQL语句的查询方式,同时也提供了更加面向对象的封装。完整的HQL语句形式如下:
* 在程序中采用session.getNamedQuery()方法得到hql查询串
参见:Student.hbm.xml、NameQueryTest.java
6、查询过滤器
* 在映射文件中定义过滤器参数
* 在类的映射中使用这些参数
* 在程序中启用过滤器
参见:Student.hbm.xml、FilterQueryTest.java
7、分页查询【重要】
* setFirstResult(),从0开始
* setMaxResults,每页显示多少条数据
参见:PageQueryTest.java
8、对象导航查询,在hql中采用 . 进行导航【重要】
参见:ObjectNavQueryTest.java
List list=session.createQuery(“select new User(,user.age) from User user ”).list();
for(int i=0;i
User user=(User)list.get(i);
user.setName(“gam”);
9、连接查询【重要】
* 内连
* 外连接(左连接/右连接)
参见:JoinQueryTest.java
10、统计查询【重要】
参见:StatQueryTest.java
11、DML风格的操作(尽量少用,因为和缓存不同步)
参见:DMLQueryTest.java
3、 属性查询:
很多时候我们在检索数据时,并不需要获得实体对象所对应的全部数据,而只需要检索实体对象的部分属性所对应的数据。这时候就可以利用HQL属性查询技术,如下面程序示例:
List list=session.createQuery(“select from User user ”).list();
因为HQL语句与标准SQL语句相似,所以我们也可以在HQL语句中使用where字句,并且可以在where字句中使用各种表达式,比较操作符以及使用“and”,”or”连接不同的查询条件的组合。看下面的一些简单的例子:
from User user where user.age=20;
from User user where user.age between 20 and 30;
for(int i=0;i
System.out.println(list.get(i));
}
我们只检索了User实体的name属性对应的数据,此时返回的包含结果集的list中每个条目都是String类型的name属性对t list=session.createQuery(“select ,user.age from User user ”).list();
参见:SimpleObjectQueryTest1.java/SimpleObjectQueryTest2.java
3、条件查询【重要】
* 可以采用拼字符串的方式传递参数
* 可以采用 ?来传递参数(索引从0开始)
* 可以采用 :参数名 来传递参数
* 如果传递多个参数,可以采用setParamterList方法
String hql=”delete from User user where user.age=18”;
Query queryupdate=session.createQuery(hql);
int ret=queryupdate.executeUpdate();
mit();
int ret=queryupdate.executeUpdate();
mit();
通过这种方式我们可以在Hibernate3中,一次性完成批量数据的更新,对性能的提高是相当的可观。同样也可以通过类似的方式来完成delete操作,如下面的代码:
Transaction trans=session.beginTransaction();
hibernate查询语言hql
在hql中关键字不区分大小写,但是属性和类名区分大小写
1、简单属性查询【重要】
* 单一属性查询,返回结果集属性列表,元素类型和实体类中相应的属性类型一致
* 多个属性查询,返回的集合元素是对象数组,数组元素的类型和对应的属性在实体类中的类型一致
数组的长度取决与select中属性的个数
for(int i=0;i
Object[] obj=(Object[])list.get(i);
System.out.println(obj[0]);
System.out.println(obj[1]);
}
此时返回的结果集list中,所包含的每个条目都是一个Object[]类型,其中包含对应的属性数据值。作为当今我们这一代深受面向对象思想影响的开发人员,可能会觉得上面返回Object[]不够符合面向对象风格,这时我们可以利用HQL提供的动态构造实例的功能对这些平面数据进行封装,如下面的程序代码:
* 如果认为返回数组不够对象化,可以采用hql动态实例化Student对象
参见:SimplePropertyQueryTest.java
2、实体对象查询【重要】
* N + 1问题,在默认情况下,使用query.iterate查询,有可以能出现N+1问题
所谓的N+1是在查询的时候发出了N+1条sql语句
如果你是逐个章节阅读的化,那么你一定会记起我在第二部分中有关批量数据操作的相关论述中,讨论过这种操作方式,这种操作方式在Hibernate3中称为bulk delete/update,这种方式能够在很大程度上提高操作的灵活性和运行效率,但是采用这种方式极有可能引起缓存同步上的问题(请参考相关论述)。
Transaction trans=session.beginTransaction();
String hql=”update User user set user.age=20 where user.age=18”;
Query queryupdate=session.createQuery(hql);
from User user where user.age in(20,30);
相关文档
最新文档