论坛首页 Java企业应用论坛

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

浏览 43221 次
该帖已经被评为良好帖
作者 正文
   发表时间:2008-09-23  
movingboy 写道
cats_tiger 写道
这个不错,投个良好贴:D
ibatis可以很好的解决这类问题。

不懂ibatis,能否请你大致地描述一下解决办法或思路?

解决方法就是直接写SQL……
0 请登录后投票
   发表时间:2008-09-23  
Quake Wang 写道
根据用户输入,动态创建查询是很常见的需求,但是Query By Example只能解决简单的属性对比,正如同你说的,between查询或者一个in查询都是很麻烦的。

Query By Criterion是解决这种需求的最好方法,你需要实现的只是一个将用户输入转化成动态创建Criterion的通用方法,能够将map或者list之类容器中的值转化即可:
["eq", "propertyName", "abc"], ["between", "propertyName", "lo", "hi"], ["in", "propertyName", [1, 2, 3]] => Restrictions.eq and Restrictions.between and Restrictions.in

Restrictions只是对各种Criterion实现的提供了静态方法调用,你也可以直接实现一个map/list => criterion的转化方法。

同意
详见POEAA中相关章节
0 请登录后投票
   发表时间:2008-09-24  
ray_linn 写道
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根本就做不到,就是做到了也是麻烦得不得了。




这种思路不错,跟ibatis很象,比较灵活
0 请登录后投票
   发表时间:2008-09-25  
hibernate 对于中小型项目的 所以大家也没有必要这么火热,其实应该转到ibatis上,这些问题就不是问题了!
0 请登录后投票
   发表时间:2008-11-12  
貌似您的代码不能达到这样的效果呀
Category category = new Category();  
category.setName("xyz");  
Product product = new Product();  
product.setCategory(category);  
 
List<Product> products = getProducts(product);

关联不到category的name
只能关联到id
0 请登录后投票
   发表时间:2008-11-12  
好像是当你用这种方法查询时 你虽然设置了
//Hibernate的原版Example
//如果属性类型是关联的实体,则忽略
private boolean isPropertyIncluded(Object value, String name, Type type) {
return !excludedProperties.contains(name) &&
!type.isAssociationType() &&
selector.include(value, name, type);
}

//改版的AssociationExample
  private boolean includeAssociations = true;

  public boolean isIncludeAssociations()
  {
    return includeAssociations;
  }

  public void setIncludeAssociations(boolean includeAssociations)
  {
    this.includeAssociations = includeAssociations;
  }

//如果属性类型是关联的实体,且该关联是一对一或多对一,且includeAssociations为true,则包括该属性
  private boolean isPropertyIncluded(Object value, String name, Type type) {
    return
      !excludedProperties.contains(name) &&
      selector.include(value, name, type) &&
      (!type.isAssociationType() ||
        (type.isAssociationType() &&
          includeAssociations &&
          !type.isCollectionType()));
  }

但是hibernate在运行的时候这能
String critCondition = crit.toSqlString(criteria, cq);
    if ( buf.length()>1 && critCondition.trim().length()>0 ) buf.append(" and ");
    buf.append(critCondition);
转变关联表的主键 到sql中去 但是一般都不会用关联表的主键去查询的 不设置还报错 呵呵 不知道是不是我的hibernate版本的问题 3.2.6ga
0 请登录后投票
   发表时间:2008-11-17  
??? 没人来了 呵呵
0 请登录后投票
   发表时间:2008-11-17  
jerry256 写道
??? 没人来了 呵呵

你发个站内短信给我,附上完整的工程代码、配置、数据库脚本及你觉得有必要说明的内容,我帮你试试吧
0 请登录后投票
   发表时间:2008-11-17  
movingboy 写道
jerry256 写道
??? 没人来了 呵呵

你发个站内短信给我,附上完整的工程代码、配置、数据库脚本及你觉得有必要说明的内容,我帮你试试吧

就是用你的那个代码 用EnhancedExample随便建一个测试项目 但是完成不了预想的结果 呵呵
0 请登录后投票
   发表时间:2008-11-17  
movingboy 写道
jerry256 写道
??? 没人来了 呵呵

你发个站内短信给我,附上完整的工程代码、配置、数据库脚本及你觉得有必要说明的内容,我帮你试试吧

关键还是不能使用EnhancedExample的关联查询
0 请登录后投票
论坛首页 Java企业应用版

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