上回写到一个一个最基本的HQL 查询语句写出来都没有什么自信,这一课时就补上HQL 相关的知识。

这种东西笔者最喜欢的官方的原版说明文档了。

http://docs.jboss.org/hibernate/orm/4.2/devguide/en-US/html/ch11.html

53.1 大小写敏感度

HQL 中的Java 类和属性是大小写敏感的,其他都是大小写不敏感的。一般来说,我们约定试用全小写的形式。

53.2 CURD 语法

基本的select update delete insert 语法。

53.2.1 Select 语句

范式如下:

select_statement :: =
[select_clause]
from_clause
[where_clause]
[groupby_clause]
[having_clause]
[orderby_clause]

最简单的形式可以这样:

from com.acme.Cat

JPQL 中的Select 语句和HQL 中相同,唯一的区别就是JPQL 中不能省略 [select_clause]

所以如果以后有移植JPA 需要的话,建议都把 [select_clause] 带上。当然在风格上来说,我们也建议都带上 [select_clause].

53.2.2 Update 语句

范式如下:

update_statement ::= update_clause [where_clause]

update_clause ::= UPDATE entity_name [[AS] identification_variable]
        SET update_item {, update_item}*

update_item ::= [identification_variable.]{state_field | single_valued_object_field}
        = new_value

new_value ::= scalar_expression |
                simple_entity_expression |
                NULL

以下是三种形式实现的示例

String hqlUpdate =
"update Customer c " +
"set c.name = :newName " +
"where c.name = :oldName";
int updatedEntities = session.createQuery( hqlUpdate )
.setString( "newName", newName )
.setString( "oldName", oldName )
.executeUpdate();

String jpqlUpdate =
"update Customer c " +
"set c.name = :newName " +
"where c.name = :oldName";
int updatedEntities = entityManager.createQuery( jpqlUpdate )
.setString( "newName", newName )
.setString( "oldName", oldName )
.executeUpdate();

String hqlVersionedUpdate =
"update versioned Customer c " +
"set c.name = :newName " +
"where c.name = :oldName";
int updatedEntities = s.createQuery( hqlUpdate )
.setString( "newName", newName )
.setString( "oldName", oldName )
.executeUpdate();

关于Version, 暂时不深入。HQL 直接居然可以CURD,对比EF 和LINQ, 我震惊了。

53.2.3 Delete 语句

范式如下:

delete_statement ::= delete_clause [where_clause]

delete_clause ::= DELETE FROM entity_name [[AS] identification_variable]

53.2.4 Insert 语句

这个只有HQL 的实现,JPQL 里面没有。

范式如下:

insert_statement ::= insert_clause select_statement

insert_clause ::= INSERT INTO entity_name (attribute_list)

attribute_list ::= state_field[, state_field ]*

53.3 From 子句

From 用来界定Scope, 同时也可以在这个Scope 中使用别名。

53.3.1 标记变量

标记变量说白了就是别名。

使用别名是可选的,当然这个是一个很好的风格。

53.3.2 Root entity 的引用

select c from com.acme.Cat c

当然我们一般不写全类名,我们这么用:

select c from Cat c
select distinct c1
from Customer c1, Customer c2
where c1.address.state = c2.address.state
  and c2.name = 'Acme'

没啥好说的,别名大家都会用。

剩余部分留待以后

Note:

Plan List:

1 MySql

2 JVM

3 HQL 剩余部分。

4 博客增加一种H4的style

Java Hour 53 HQL的更多相关文章

  1. java中53个关键字的意义及使用方法

    摘自:https://www.cnblogs.com/feng9exe/p/9224450.html 1.java的关键字分别是什么,作用是什么? static 例子: public class Te ...

  2. java中“53”个关键字(含2个保留字)

    1.java的关键字(keyword)有多少个? 51+2个保留字=53个关键字(java的关键字都是小写的!!) 2.java的保留字(reserve word)有多少个?问题:分别是什么? 2个保 ...

  3. Java中的关键字有哪些?「Java中53个关键字的意义及使用方法」

    Java中的关键字有哪些? 1)48个关键字:abstract.assert.boolean.break.byte.case.catch.char.class.continue.default.do. ...

  4. Java基础(53):内部类(转)

    java中的内部类总结 内部类不是很好理解,但说白了其实也就是一个类中还包含着另外一个类 如同一个人是由大脑.肢体.器官等身体结果组成,而内部类相当于其中的某个器官之一,例如心脏:它也有自己的属性和行 ...

  5. java基础53 IO流技术(转换流)

    1.转换流 1.输入字节的转换流:InputStreamReader是字节流转为字符流的桥梁,可以把输入字节流转换为输入字符流    2.输出字节流的转换流:OutputStreamWriter是字符 ...

  6. Java JPA通过hql语句查询数据

    import javax.persistence.PersistenceContext; import javax.persistence.Query; public class StudentSer ...

  7. Error invoking SqlProvider method (com.github.abel533.mapper.MapperProvider.dynamicSQL). Cause: java.lang.InstantiationException: com.github.abel533.mapper.MapperProvider

    org.apache.ibatis.exceptions.PersistenceException: ### Error querying database.  Cause: org.apache.i ...

  8. ?--Porg.springframework.beans.MethodInvocationException: Property 'username' threw exception; nested exception is java.lang.NullPointerException

    使用BoneCP作为连接池,在启动Tomcat报出以下异常: 一月 02, 2016 2:12:17 下午 org.apache.tomcat.util.digester.SetPropertiesR ...

  9. 使用Java编写并运行Spark应用程序

    我们首先提出这样一个简单的需求: 现在要分析某网站的访问日志信息,统计来自不同IP的用户访问的次数,从而通过Geo信息来获得来访用户所在国家地区分布状况.这里我拿我网站的日志记录行示例,如下所示: 1 ...

随机推荐

  1. php闭包支持

    匿名函数提到闭包就不得不想起匿名函数,也叫闭包函数(closures),貌似PHP闭包实现主要就是靠它.声明一个匿名函数是这样: $func = function() { }; //带结束符 可以看到 ...

  2. Java I/O操作

    按字节读取读取文件,并且将文件里面的内容写到另外一个文件里面去 public class CopyBytes { public static void main(String[] args) thro ...

  3. SqlServer 连接字符串多种配置

    Application Name(应用程序名称):应用程序的名称.如果没有被指定的话,它的值为.NET SqlClient Data Provider(数据提供程序). AttachDBFilenam ...

  4. C++中map的基本操作和使用;

    注:本文来自sina live 的博文 Map是c++的一个标准容器,她提供了很好一对一的关系,在一些程序中建立一个map可以起到事半功倍的效果,总结了一些map基本简单实用的操作!1. map最基本 ...

  5. 还原网站上被压缩的JS代码方便阅读

    我们经常可以看到一些网站,把所需的javascript代码压缩成一行,就像下图这样: 这种代码浏览器能读懂,但正常人是没法阅读的. 既然浏览器能读,浏览器当然也能还原这段代码. 其实很简单.这里我使用 ...

  6. Matlab的曲线拟合工具箱CFtool使用简介

    http://phylab.fudan.edu.cn/doku.php?id=howtos:matlab:mt1-5 一. 单一变量的曲线逼近Matlab有一个功能强大的曲线拟合工具箱 cftool ...

  7. quartz定时任务时间设置

    这些星号由左到右按顺序代表 :     *    *     *     *    *     *   *                                   格式: [秒] [分] ...

  8. SGU-169 Numbers(找规律)

    题目链接:http://acm.sgu.ru/problem.php?contest=0&problem=169 解题报告: P(n)定义为n的所有位数的乘积,例如P(1243)=1*2*3* ...

  9. 第9章 使用ssh服务管理远程主机。

    章节简述: 学习使用nmtui命令配置网卡参数.手工将多块网卡做绑定.使用nmcli命令查看网卡信息和使用ss命令查看网络及端口状态. 完整演示sshd服务配置方法并详细讲述每个参数的作用,实战基于密 ...

  10. Difference between git pull and git pull --rebase

    个人博客地址:  http://www.iwangzheng.com/ 推荐一本非常好的书 :<Pro Git>  http://iissnan.com/progit/ 构造干净的 Git ...