该帖已经被评为良好帖
|
|
---|---|
作者 | 正文 |
发表时间:2008-09-23
movingboy 写道 cats_tiger 写道 这个不错,投个良好贴:D
ibatis可以很好的解决这类问题。 不懂ibatis,能否请你大致地描述一下解决办法或思路? 解决方法就是直接写SQL…… |
|
返回顶楼 | |
发表时间: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中相关章节 |
|
返回顶楼 | |
发表时间: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很象,比较灵活 |
|
返回顶楼 | |
发表时间:2008-09-25
hibernate 对于中小型项目的 所以大家也没有必要这么火热,其实应该转到ibatis上,这些问题就不是问题了!
|
|
返回顶楼 | |
发表时间: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 |
|
返回顶楼 | |
发表时间: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 |
|
返回顶楼 | |
发表时间:2008-11-17
??? 没人来了 呵呵
|
|
返回顶楼 | |
发表时间:2008-11-17
jerry256 写道 ??? 没人来了 呵呵
你发个站内短信给我,附上完整的工程代码、配置、数据库脚本及你觉得有必要说明的内容,我帮你试试吧 |
|
返回顶楼 | |
发表时间:2008-11-17
movingboy 写道 jerry256 写道 ??? 没人来了 呵呵
你发个站内短信给我,附上完整的工程代码、配置、数据库脚本及你觉得有必要说明的内容,我帮你试试吧 就是用你的那个代码 用EnhancedExample随便建一个测试项目 但是完成不了预想的结果 呵呵 |
|
返回顶楼 | |
发表时间:2008-11-17
movingboy 写道 jerry256 写道 ??? 没人来了 呵呵
你发个站内短信给我,附上完整的工程代码、配置、数据库脚本及你觉得有必要说明的内容,我帮你试试吧 关键还是不能使用EnhancedExample的关联查询 |
|
返回顶楼 | |