1.命名规范

1.1定制对象命名规则

本规范中采用的命名规则,基本模式为:前缀_描述。其中前缀根据定制对象、变量类型的不同而变化。

示例:

前缀 定制对象 举例说明
pkg 程序包 个人帐户     pkg_psnAccount
proc 过程(单独的过程) 生成个人帐户 proc_createPsnAccount
fun 函数 确定缴费比例 fun_confirmjfbl
ind 索引 ind_
tri 触发器 tri_
v 视图 v_
seq 序列发生器 seq_
pk 主键 pk_
fk 外键 fk_
syn 同义词 syn_
dlk DB LINK dlk_
snp 快照 snp_

1.2.变量命名规则

变量命名规则中前缀由两部分组成:变量类型前缀+数据类型前缀。

变量类型前缀规则如下表:

前 缀 变量类型
g 全局变量
k 常量

数据类型前缀命名规则如下表:

前 缀 数据类型
bin Binary_Integer
b Boolean
c Char
d Date
l Long
lob LOB
n Number
dec Decimal
dbl Double
i Integer
f Float
r REAL
pls PLS_INTEGER
Rec %ROWTYPE
raw RAW
row ROWID
str Varchar2
cur CURSOR
refcur REF CURSOR
u 用户自定义数据类型
typ TYPE自定义类型类型
e 异常(EXCEPTION)

以下是数据类型前缀命名规则的例子:

声明一全局类数值型:gn_grsxh

声明一局部类字符型:str_name

或全部采用v_变量名(同一系统命名时只能采用两种方式中的一种)

以下是采用v_变量名规则的例子:

声明一全局类数值型:gv_grsxh

声明一局部类字符型:v_name

说明:对于未在上述数据类型中列出的其它数据类型(包括系统提供的数据类型),其数据类型前缀的命名必须不与上表中的前缀重名,它们的前缀命名规则是未规定的。

java

String queryString = "select c from Customer c where c.name = ?1  or c.nickName = ?1";
List customers = session.createQuery( queryString ).setParameter( "1", theNameOfInterest ).list();//注意1带有双引号("")

javascript

String queryString = "select c from Customer c where c.name = ?1  or c.nickName = ?1";
List customers = session.createQuery( queryString ).setParameter( "1", theNameOfInterest ).list();//注意1带有双引号("")

ruby

String queryString = "select c from Customer c where c.name = ?1  or c.nickName = ?1";
List customers = session.createQuery( queryString ).setParameter( "1", theNameOfInterest ).list();//注意1带有双引号("")

c/cpp

String queryString = "select c from Customer c where c.name = ?1  or c.nickName = ?1";
List customers = session.createQuery( queryString ).setParameter( "1", theNameOfInterest ).list();//注意1带有双引号("")

markdown/xml/php

String queryString = "select c from Customer c where c.name = ?1  or c.nickName = ?1";
List customers = session.createQuery( queryString ).setParameter( "1", theNameOfInterest ).list();//注意1带有双引号("")

yaml

String queryString = "select c from Customer c where c.name = ?1  or c.nickName = ?1";
List customers = session.createQuery( queryString ).setParameter( "1", theNameOfInterest ).list();//注意1带有双引号("")

python

String queryString = "select c from Customer c where c.name = ?1  or c.nickName = ?1";
List customers = session.createQuery( queryString ).setParameter( "1", theNameOfInterest ).list();//注意1带有双引号("")

常见区别一: hql对sql中的Positional parameters和Named parameters的使用方式是相同的,而jpql对Positional parameters有些不同 以下是两者在Positional parameters区别的例子:

HQL

String queryString = "select c from Customer c where c.name = ?1  or c.nickName = ?1";
List customers = session.createQuery( queryString ).setParameter( "1", theNameOfInterest ).list();//注意1带有双引号("")

JPQL

String queryString = "select c from Customer c where c.name = ?1  or c.nickName = ?1";
List<Customer> customers = entityManager.createQuery( queryString, Customer.class ).setParameter( 1, theNameOfInterest ).getResultList(); //1不带有""

常见区别二: jpql可以直接转为hql,而hql却不一定能转为jpql

常见区别三: hibernate不强迫jpql的sql语句是必须select的,而hql却被支持可以不用select

常见区别四: hql支持使用特殊的insert语句,但jpql不支持:

String hqlInsert = "insert into DelinquentAccount (id, name) select c.id, c.name from Customer c where ...";
int createdEntities = s.createQuery( hqlInsert ).executeUpdate();//直接可以根据查询出来的id和name 放入到DelinquentAccount (id, name)

常见区别五: hql支持在使用join关联方式的时候,使用特殊方式来添加条件,而jpql不支持

正常sql:

select distinct c from Customer c left outer join c.orders o where o.value > 5000.00

特殊sql:

select distinct c from Customer c left join c.orders o with o.value > 5000.00