‘壹’ hibernate切换了不同的数据库,那hql还需要改动吗它会自动转换成对应数据库语言的sql吗
不需要改动。hql是独立于数据库的,hibernate切换数据库以后,除了jdbc的一些如地址、用户名、密码要换以外。
Hibernate支持不同的数据库主要是用方言也就是dialect的,对应就是hibernate.cfg.xml配置文件里的一个设置,比如 SQL Server的就是:
<propertyname="hibernate.dialect"value="org.hibernate.dialect.SQLServerDialect"/>
这里的org.hibernate.dialect.SQLServerDialect是hibernate带的或你自己提供的一个数据库数据类型映射的一个Java类,由它处理不同数据库的区别。
但是如果不同的数据库之间差别太大的话,即直接要写不同的SQL语句的话,Hibernate的dialect也处理不了。
‘贰’ SQL语句转换成HQL语句
你要知道hql语句是针对的对象,而sql语句是对表,hql中一般改写的 查询语句 。所以改起来很容易的,
以第一个为例SELECT TA001,TA002,TA006,SUM(TA015-ISNULL(TA017,0)) AS T1 INTO #MOC1
FROM MOCTA WHERE TA011 IN ('1','2','3') AND TA013='Y' AND TA010>='20130901' AND TA010<='20130930'
GROUP BY TA001,TA002,TA006
可以看出来MOCTA这个表中包含TA001,TA002,TA006等几列,所以你先用hibernate映射成对象的各属性,如Mocta 这个类对应这个表,其中有ta001,ta002,ta006等属性。然后改写成下面:
select m.ta001,m.ta002,sum(m.ta006) from Mocta as m where m.ta001 = '????' and ???
就可以了
‘叁’ hql 内连接sql转成hql
select * from Storage(类) s ,Proct(类) p where s.proctid=p.id and p.banktype='成品库' and s.storagecount>=p.warncountup;
‘肆’ 如何查看hql 转换后的sql
1、如果是Query query = session.createQuery("")的话,试一下去掉前面的“select *”即createQuery方法内的条件直接是“from ......”,有几个是可以用的,因为支持部分SQL。
不行的话就用下面的格式(排序必用):
select OBJECT(o) from A o where o.b in(21,32)
select OBJECT(o) from A o order by o.b ASC
2、Hibernate中实现模糊查询,可有以下三种方式:
第一种方式:QBC查询
String name = "", info = "";
if (sub != null && sub.getSubname() != null) {
name = sub.getSubname();
}
if (sub != null && sub.getSubinfo() != null) {
info = sub.getSubinfo();
}
Criteria cr = session.createCriteria(Subject.class);
cr.add(Expression.like("subname","%"+name+"%"));
cr.add(Expression.like("subinfo","%"+info+"%"));
第二种方式:HQL查询语句
String hql = "from Subject as s where s.subname like :name and s.subinfo like :info";
// 调用session的获得数据列表方法,传递HQL查询语句
Query query = session.createQuery(hql);
query.setString("name","%"+name+"%");
query.setString("info","%"+info+"%");
System.out.println("*********"+hql);
第三种方式:HQL查询语句(查询条件只能为英文或数字,汉字在传递到hibernate内部时出现乱码问题)
String hql = "from Subject as s where s.subname like '%"+name+"%' and s.subinfo like '%"+info+"%'";//调用session的获得数据列表方法,传递HQL查询语句
Query query = session.createQuery(hql);
注:Subject为数据库表subject映射的类;它有相应的属性subname、subinfo及相应的get和set方法;sub为Subject的一个实例化对象。
‘伍’ 把sql转换正HQL 数据库:oracle
from(select * from title t order by t.createdate desc ) where rownum=1
这就是传说中的hql语句。
‘陆’ sql语句怎么转化为hql语句
1、如果是Query query = session.createQuery("")的话,试一下去掉前面的“select *”即createQuery方法内的条件直接是“from ......”,有几个是可以用的,因为支持部分SQL。
不行的话就用下面的格式(排序必用):
select OBJECT(o) from A o where o.b in(21,32)
select OBJECT(o) from A o order by o.b ASC
2、Hibernate中实现模糊查询,可有以下三种方式:
第一种方式:QBC查询
String name = "", info = "";
if (sub != null && sub.getSubname() != null) {
name = sub.getSubname();
}
if (sub != null && sub.getSubinfo() != null) {
info = sub.getSubinfo();
}
Criteria cr = session.createCriteria(Subject.class);
cr.add(Expression.like("subname","%"+name+"%"));
cr.add(Expression.like("subinfo","%"+info+"%"));
第二种方式:HQL查询语句
String hql = "from Subject as s where s.subname like :name and s.subinfo like :info";
// 调用session的获得数据列表方法,传递HQL查询语句
Query query = session.createQuery(hql);
query.setString("name","%"+name+"%");
query.setString("info","%"+info+"%");
System.out.println("*********"+hql);
第三种方式:HQL查询语句(查询条件只能为英文或数字,汉字在传递到hibernate内部时出现乱码问题)
String hql = "from Subject as s where s.subname like '%"+name+"%' and s.subinfo like '%"+info+"%'";//调用session的获得数据列表方法,传递HQL查询语句
Query query = session.createQuery(hql);
注:Subject为数据库表subject映射的类;它有相应的属性subname、subinfo及相应的get和set方法;sub为Subject的一个实例化对象。
‘柒’ SSh框架hql语句转sql语句中文乱码
你直接在HQL中使用中文字符?
这么做的话,你要保证代码编辑器所用的字符集、数据库所用字符集、数据表所用字符集均为同一种字符集才可。
在代码中,要尽量避免显式的使用中文。
在数据库字段中出现中文就更不应该了。
‘捌’ 如何把SQL语句转换为HQL语句
首先你应该知道什么是sql和hql,hql是在hibernate框架中为了那些只会java不会sql的人来操作数据库,首先要将每个表对应建立一个类,例如表名字叫table那么建立的类名字就是Table,hql语句和sql差的不是很多,不过hql是对这个类进行操作的,sql是对数据库操作的。hql是一个程序员发明的,发明hibernate框架的人就把hql能转换成sql,而你要把sql转换成hql就很难了,起码你应该要有他的那种水平,而且还没什么意义,因为数据库最终识别的还是sql语句。
‘玖’ 在程序中将HQL转换成sql(100分)
最好的方法是,去看hibernate 的源码,然后,去修改那段 sysout...println(sql) 的sql返回到你的调用处,这样就可以了。
你在修改后,从新编译一下替换原有hibnate包中的类就ok了!!
祝你好运朋友!!!
‘拾’ sql 转换为hql
下面就是
sql 转换为hql的换算方法
FROM pa_cons_mngt_cost pcmc , sa_sys_period sp , a ,SA_WORK_GRP wg ,loc
WHERE pcmc.charging_wk_grp_id = wg.wk_grp_id
AND pcmc.FROM_LOC_ID = loc.loc_id
AND pcmc.gc_cost_subtype_cd<>'-1'
AND pcmc.bu_id = wg.bu_id
AND sp.bu_id = pcmc.bu_id
AND buIdFilter
AND wg.OU_ID=a.childid
AND pcmc.gc_cost_type_cd IN ('O')
AND pcmc.txn_period_id = sp.sys_period_id
AND compose_date (sp.sys_period_year , sp.sys_period_month , 1)
BETWEEN compose_date ( :year , :fromMonth , 1)
AND compose_date ( :toYear , :toMonth , 1)
)
GROUP BY costtype , ou_id ,ou_cd
ORDER BY ou_id , costtype ]]>