论坛首页 Java企业应用论坛

一个关于Hibernate的优化实例:从HQL到QBC,从QBC到QBE,再到“增强的”QBE

浏览 43222 次
该帖已经被评为良好帖
作者 正文
   发表时间:2008-08-29  
ibatis是王道啊,呵呵:)
既可以研究深入的sql,又能方便的映射对象
0 请登录后投票
   发表时间:2008-08-29  
QBE确实挺好的,不过用静态语言实现起来不是很方便,因为QBE从本质上说是一种dsl
在QBE中需要处理几个结构的表达
  between  这个一般采用 a:b这种形式 ,例如 1:100
  in       可以直接用 in(1,2,5,6)这样
  like     这种可以通过判断字符串中是否有% _ 这样的来决定是否要like
hibernate和ibatis要处理这些好像都不是很方便
用sql写可能更好些,用map获取这些参数,然后解析字符串
自己写拼sql的基础设施好像不是很难呀,不明白为什么要用hibernate,ibatis这些东东
0 请登录后投票
   发表时间:2008-08-30  
Hibernate的QBDC楼上的没用过吧。
自己手动拼sql是万恶之源。

相比之下iBatis比较适合楼上的。
0 请登录后投票
   发表时间:2008-08-30  
各有各的特点。每一种方式应该有一种操作规范,保证正确性,性能,安全等
0 请登录后投票
   发表时间:2008-08-31  
需求是千变万化的。
能满足需求即是合理的。
Hibernate, ibatis, 抑或JDBC,又有什么关系?
0 请登录后投票
   发表时间:2008-08-31  
其实你做的不错 只不过现在垃圾比较多 都不明白你 不过我还是支持下你吧
0 请登录后投票
   发表时间:2008-08-31  
jdbc不是更好吗?还要用hibernate! 根据实际情况用吧!又是叫全部用jdbc做!大杂烩也可以呀!
0 请登录后投票
   发表时间:2008-09-01  
movingboy 写道
ray_linn 写道
浪费这么多行代码,做的都是无用功。

能否请你说明一下为何你认为这么做是浪费,是做无用功?对于文中提到的问题,你会怎么解决呢?


连基本的查询方式in range, (26<会员.age<35)都没办法做到,是不是毫无价值?

要解决这个问题很简单,我写个HSQLTemplate

<dynamic-query name="memberList">
from Member m where [#Mix<m.age<#Max] and (m.salary>#salary) and [m.city in (@city)] and m.gender=#gender
</dynamic-query>

# 代表变量, @代表集合,[] 代表若变量为null,则该条件被忽略。俺只需要把HSQLTemplate注入DAO中,接受一个Map作为参数就可以完成HSQL的自动拼装。

这样的HSQL生成器不难吧?

这样的查询不过分吧?包括了in range和in list 你的QBE根本就做不到,就是做到了也是麻烦得不得了。

3 请登录后投票
   发表时间:2008-09-01  
终于看到顺眼的解决方案了
0 请登录后投票
   发表时间:2008-09-01  
Hibernate 的Cirteria 本意是好的,但在实际项目中,最好别用它,因为实际项目中的查询大部分是复杂查询。我给大家介绍一个我认为最好的方法,iBatis 还是太难用了。

1 要用HQL或者 native SQL;
2.要解决参数的占位符问题;
3.要解决动态HQL或SQL问题;
4.要解决数据库表到对象的映射问题。

第二条方案  用named parameter,need to prprocess the sql statement.
第三条方案,用Velocity 或者FreeMarker 模板解决。
第四条方案,用JAVA Reflection 自动映射。

例子:

SELECT FIRST_NAME firstName
      ,LAST_NAME lastName
from users u
where 1=1

#if($firstName)
and u.first_name like #{firstName}
#end

#if($lastName)
and u.last_name like #{lastName}
#end




Java code:

Map map=new HashMap();

map.put("firstName",u.firstName);
map.put("lastName", u.lastName);

List<UserVO> userList=dao.findList(map, "yourSQLName",UserVO.class);




1 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics