1.  Hibernate HQL详细说明

1.1.  hql一个简短的引论

Hibernate它配备了一种非常强大的查询语言。这种语言看起来非常像SQL。但是不要

要对相位的语法结构似,HQL是很有意识的被设计为全然面向对象的查

询,它能够理解如继承、多态和关联之类的概念。

看个演示样例,看看sql和HQL的同样与不同:

Sql:select * fromtbl_user where uuid=‘123’

HQL:select Object(o)from UserModel o where o.uuid=‘123’

1.2.  hql的特点

1)        HQL对Java类和属性是大写和小写敏感的。对其它不是大写和小写敏感的。

2)        基本上sql和HQL是能够转换的,由于依照Hibernate的实现原理,终于执行的还是sql,仅仅只是是自己主动生成的而已。

3)        HQL支持内连接和外连接

4)        HQL支持使用聚集函数,如:count、avg、sum、min、max等

5)        HQL支持order by 和 group by

6)        HQL支持条件表达式。如:in、like、between等

1.3.  select子句

1)        直接返回对象集合。形如:select o from UserModel o

2)        返回某个特定类型的集合。形如:select o.name from UserModel o

3)        返回Object[],形如:select o.uuid,o.name from UserModel o

4)        返回List。形如:select new List(o.uuid,o.name) from UserModel o

5)        返回随意的对象,形如:select new cn.javass.h3.hello.A(o.uuid,o.name) from UserModel o 。这要求A对象有一个构造方法是传入这两个參数

6)        返回Map类型。形如:select new Map(o.uuid as Id,o.name as N) from UserModel o ,返回的结果。以as后面的别名做map的key,相应的数据做值

Session session = HibernateSessionFactory.getSession();

//     Query query = session.createQuery("select d from Department d");

//     List<Department> list = query.list();

//     for (Department department : list) {

//         System.out.println(department.getDeptname());

//     }

//     Query query = session.createQuery("select d.deptname from Department d");

//     List<String> list = query.list();

//     for (String string : list) {

//         System.out.println(string);

//     }

//     Query query = session.createQuery("select d.deptid,d.deptname from Department d");

//     List<Object[]> list = query.list();

//     for (Object[] strs : list) {

//         System.out.println(Arrays.toString(strs));

//     }

//     Query query = session.createQuery("select new List(d.deptid,d.deptname) from Department d");

//     List<List<String>> list = query.list();

//     for (List<String> list2 : list) {

//         for (String string : list2) {

//            System.out.println(string);

//         }

//     }

Query query = session.createQuery("select new Map(d.deptid as id,d.deptname as name) from Department d");

List<Map<String, String>> list = query.list();

for (Map<String, String> map : list) {

System.out.println(map.toString());

}

1.4.  from子句

1)        直接from对象。形如: from UserModel

2)        能够分配别名,形如:from UserModel as um 。 askeyword能够省略

3)        假设from后面有多个对象。形如:from UserModel,DepModel 。相当于多表联合查询,返回他们的笛卡尔积

Query query = session.createQuery("from Department,Employee");

List<Object[]> list = query.list();

for (Object[] objects : list) {

Department department = (Department) objects[0];

Employee employee = (Employee) objects[1];

System.out.println(department);

System.out.println("------------");

System.out.println(employee);

}

1.5.  聚集函数

1)        受支持的有avg,sum,min,max,count

2)        keyword distinct 与all 也能够使用,它们具有与 SQL 同样的语义,比方:

selectcount(distinct o.name) from UserModel o

1.6.  where子句

1)        假设前面没有指派别名,那就直接使用属性名

2)        假设指派了别名,必须使用别名.属性的方式

3)        在where子句中同意使用的表达式包含大多数在 SQL中使用的表达式。包含:

a)        数学运算符 +。-,*,/

b)        二进制比較运算符 =, >=, <=, <>, !=, like

c)        逻辑运算符 and,or,not

d)        括号 ( )。表示分组

e)        in, not in, between, is null,is not null, is empty, is not empty, member of and not member of

f)         字符串连接符 ...||... or concat(...,...)

g)        current_date(), current_time(),and current_timestamp()

h)        second(...)、minute(...)、hour(...)、day(...)、month(...) 和 year(...)

i)          EJB-QL 3.0 定义的不论什么功能或操作符:substring(),trim(), lower(), upper(), length(),locate(), abs(), sqrt(), bit_length(), mod()

j)          coalesce() 和 nullif()

k)        str() 把数字或者时间值转换为可读的字符串

l)          cast(... as ...)。其第二个參数是某 Hibernate类型的名字,以及extract(... from ...),仅仅要 ANSI cast() 和 extract() 被底层数据库支持

m)      HQL index() 函数,作用于 join 的有序集合的别名。

n)        HQL 函数,把集合作为參数:size(),minelement(), maxelement(), minindex(), maxindex(),还有特别的 elements()和 indices 函数,能够与数量词加以限定:some, all, exists, any, in。

o)        不论什么数据库支持的SQL 标量函数,比方sign(), trunc(), rtrim(), sin()

p)        JDBC 风格的參数传入 ?

q)        命名參数:name。:start_date,:x1

r)         SQL 直接常量 'foo',69, 6.66E+2, '1970-01-01 10:00:01.0'

s)        Java public static final 类型的常量 eg.Color.TABBY

1.7.  group by 子句

1)        对于返回聚集值的查询,能够依照不论什么属性进行分组

2)        能够使用having子句

3)        sql中的聚集函数,能够出如今having子句中

4)        group by 子句与 order by 子句中都不能包括算术表达式

5)        不能group by 某个实体对象。必须明白的列出全部的聚集属性

1.8.  order by 子句

查询返回的列表(list)能够依照一个返回的类或组件(components)中的不论什么属性进行排序。可选的 asc 或 desc keyword指明了依照升序或降序进行排序。

1.9.  子查询

对于支持子查询的数据库,Hibernate支持在查询中使用子查询。

一个子查询必须被圆括号包围起来。

1.10.    连接(join)

1)        Hibernate能够在相关联的实体间使用join。类似于sql。支持inner join、left outerjoin、right outer join、full join(全连接。并不经常使用)。

2)        inner join能够简写成join,left outerjoin 和right outer join在简写的时候能够把outer去掉。

1.11.    with

通过 HQL 的 with keyword,你能够提供额外的 join条件。

如:from Cat as cat left join cat.kittens as kitten with

kitten.bodyWeight > 10.0

1.12.    fetch

能够要求马上返回关联的集合对象。如:

from Cat as cat

innerjoin fetch cat.mate

left join fetch cat.kittens

版权声明:本文博主原创文章。博客,未经同意不得转载。

Hibernate HQL详细说明的更多相关文章

  1. weblogic10异常:org.hibernate.hql.ast.HqlToken

    转自:http://www.programgo.com/article/68682994452/ 在做查询的时候,报出  org.hibernate.QueryException: ClassNotF ...

  2. SSH整合报错:org.hibernate.hql.internal.ast.QuerySyntaxException: User is not mapped[......]

    非常诡异的报错,信息如下:org.hibernate.hql.internal.ast.QuerySyntaxException: User is not mapped [select count(* ...

  3. hibernate配置文件详细解释

    <!--标准的XML文件的起始行,version='1.0'表明XML的版本,encoding='gb2312'表明XML文件的编码方式--> <?xml version='1.0' ...

  4. Hibernate HQL查询:

    Hibernate HQL查询:Criteria查询对查询条件进行了面向对象封装,符合编程人员的思维方式,不过HQL(Hibernate Query Lanaguage)查询提供了更加丰富的和灵活的查 ...

  5. Hibernate学习笔记-Hibernate HQL查询

    Session是持久层操作的基础,相当于JDBC中的Connection,通过Session会话来保存.更新.查找数据.session是Hibernate运作的中心,对象的生命周期.事务的管理.数据库 ...

  6. 解决Eclipse编译器报错ClassNotFoundException:Org.hibernate.hql.ast.HqlToken

    最近开发遇到Eclipse编译器老是报出ClassNotFoundException:Org.hibernate.hql.ast.HqlToken [from User Where id=1] 的错误 ...

  7. java.lang.IllegalStateException: No data type for node: org.hibernate.hql.ast.tree.MethodNode(尼玛,蛋疼的错误)

    java.lang.IllegalStateException: No data type for node: org.hibernate.hql.ast.tree.MethodNode   \-[M ...

  8. WebLogic使用SSH架构部署遇到org.hibernate.hql.internal.ast.HqlTok

    其实这个问题在以前就遇到过,当时解决了,但今天在部署一个测试轻应用的时候一直没有想起来,特此记录一下. 这个问题出现在使用WebLogic(我使用的是10.3.5版本)发布SSH架构的应用.在操作数据 ...

  9. Hibernate HQL查询语句总结

    Hibernate HQL查询语句总结 1. 实体查询:有关实体查询技术,其实我们在先前已经有多次涉及,比如下面的例子:String hql="from User user ";L ...

随机推荐

  1. OC 获取城市首字母

    解析依据文件中面的内容,读入一个城市,输出所在首字母 比方读入 长春 输出 c 读入 北京 输出 b 不知道文本中的字体是什么格式 读取文件时 程序不能正确执行 运用oc中的字典 initWithOb ...

  2. net 面向接口框架

    Asp.net 面向接口框架之应用程序上下文作用域组件 在团队中推广面向接口开发两年左右,成果总体来说我还是挺满意的,使用面向接口开发的模块使用Unity容器配置的功能非常稳定,便于共享迁移(另一个项 ...

  3. Window8.1 64位无法使用Debug命令的解决方法[附牛人代码]

    偶然看到网上一篇文章,讲的是世界黑客编程大赛第一名的一个很酷的程序,大小仅有4KB,使用debug命令执行. 悲催的是win8.1的debug命令不能使用. 错误例如以下: 解决方法例如以下: 1. ...

  4. JAVA card 应用开发(三) 把APPLET(CAP文件)装载到卡片

    依据前面两篇博文.我们能够在Eclipse上建立好Applet.而且能够有多个AID.能够选择不同的应用. 那么,以上我们都是基于模拟环境的逻辑,实际上有些函数接口是须要实际的环境.就是说我们须要把A ...

  5. Linux SSH端口转发

    SSH端口转发分为两种,一种是本地端口转发,又称为本地SSH隧道.一直是远程端口转发.SSH端口转发,还必须指定数据传送的目标主机,从而形成点对点的端口转发. 本地端口转发     假定有三台主机A. ...

  6. SE 2014年5月28日

    R1模拟总部,R2 与R3模拟分部 如图配置 (1)网络中目前只有两站点, R1 和R2 .同时R2为动态获取IP地址一方,要求使用要求使用 GRE over IPSec VPN 野蛮模式,保证R1和 ...

  7. gcc的bug? c++模板类中友元函数的訪问权限问题

    原文地址:http://stackoverflow.com/q/23171337/3309790 在c++中,模板类中能够直接定义一个友元函数.该函数拥有訪问该模板类非public成员的权限. 比方: ...

  8. hdu 折线切割平面 (java)

    问题: 仅仅要找到规律问题就攻克了,在做题时应该细致去发现数与数之间的联系. 折线切割平面 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit ...

  9. Knockout获取数组元素索引的2种方法,在MVC中实现

    原文:Knockout获取数组元素索引的2种方法,在MVC中实现 在遍历数组.集合的时候,通常要获取元素的索引,本篇体验使用Knockout获取索引的2种方法. 假设有这样的一个模型: namespa ...

  10. Cantor的数表 【找规律】

    小俞同学,近期勤学苦练数学,对一种数表产生了兴趣. 数表例如以下: 1/1 1/2 1/3 1/4 1/5 2/1 2/2 2/3 2/4 3/1 3/2 3/3 4/1 4/2 5/1 她冥思苦相了 ...