kedakeda
2008-10-10 00:57 阅读 464
已采纳

实例请教hibernate如何实现模糊查询

我现在需要做一个东西
其中涉及到用hibernate一个模糊查询

比如,user表,映射到一个Pojo名字叫user
里面有5个属性name,birthday,telephonenumber,address,email

现在需要做个查询,要求从页面传入这5个属性,做多个值的联合模糊查询,如果某个属性是空的,那这个属性在查询当中就是不作限制,搜寻所有的值
比如,页面输入,name="王",其他4项都是空
那么就搜索,名字当中含有“王”字的所有人,比如王军,李王军,李军王

我的思路
第一,写一个HQL语句
SELECT * FROM user
WHERE user.name LIKE string1
AND user.birthday LIKE string2
AND user.telephonenumber LIKE string3
AND address LIKE string4
AND email LIKE string5

第二,对页面传入的值做判断
如果某项为空,则这一项的string 值为通配符%
如果不为空,则在页面传入的值前后都加上通配符%
然后运行HQL语句

小弟我新学,水平还比较差
不知我的思路可行否,或者有什么问题存在,或者有什么更好的思路
各位大侠
尤其是专家们多多指教
[b]问题补充:[/b]
QBC是啥
不懂哈,请详细说明
Criteria我查了些资料,都说得不明不白的,实在是没搞懂
[b]问题补充:[/b]
另外
我知道我的HQL写得好像SQL一样
实在是不太搞得清楚HQL语法跟SQL语法有什么差别
如果高手们有空也请根据这个实例说明一下
[b]问题补充:[/b]
关于volecity
感谢兄弟的建议,但是
第一俺不会用,需要另外学,增加了项目时间
第二这个项目没打算用模板,如果用的话可能是freemarker,但还是不用为佳
所以这个方案在此项目中只好不考虑了
[b]问题补充:[/b]
关于数量和速度
俺是打算分页的,要另外写分页的类,所以没有写在这个问题里面,到时候关于分页只怕还有问题请教

另QBC的话,我的搜索里面某些需要联表查询的,当然这一个是不用的,看了很多资料,都没有涉及QBC在联表方面的用法,这也是我没有用Criteria的原因
[b]问题补充:[/b]
为什么会慢
怎么提高速度
请ThinkingInAll 教我
[b]问题补充:[/b]
多谢大家解答
但是好像只能采纳一个答案
不知道能不能像CSDN一样平均散分

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 复制链接分享

13条回答 默认 最新

  • 已采纳
    eyeqq eyeqq 2008-10-10 08:52

    你直接两边都加上%没关系的。是空的话就让它转换成"",这样子就行了。
    你用QBC写会比较好看些,维护也简单。
    [code="java"]
    List list = createCriteria(
    Expression.eq(StockDomain.STORE_HOUSE_ID, storeHouseID)).add(
    Expression.like(StockDomain.PRODUCT_NAME, productName,MatchMode.ANYWHERE)).list()
    [/code]
    MatchMode.ANYWHERE

    点赞 评论 复制链接分享
  • chenli348105874 chenli348105874 2008-10-10 09:36

    用Velocity模板写
    类似这样
    [code="java"]#if($stringOne)
    and string1 like stringOne
    #else
    [/code]

    点赞 评论 复制链接分享
  • tantenis tantenis 2008-10-10 10:55

    还是用lucence把

    点赞 评论 复制链接分享
  • chengxing6666 chengxing6666 2008-10-10 11:09

    STRING SQL="SELECT * FROM user
    WHERE 1=1 "
    if(string1不为空)
    {
    SQL=SQL+"and user.name LIKE string1 "

    }
    类推,总的说,和你的一样的思路

    点赞 评论 复制链接分享
  • chenli348105874 chenli348105874 2008-10-10 12:49

    用Velocity最简单了 不要任何基础

    点赞 评论 复制链接分享
  • chenli348105874 chenli348105874 2008-10-10 12:58

    hibernate把HQL翻译成sql,它会根据不同的数据库翻译成不同的sql

    点赞 评论 复制链接分享
  • chenli348105874 chenli348105874 2008-10-10 13:32

    什么都不用的话 你的思路挺好的 没有什么更加省力的方法了

    点赞 评论 复制链接分享
  • tantenis tantenis 2008-10-10 13:33

    你这样做,到时候数据量上去,你搜索n慢

    点赞 评论 复制链接分享
  • eyeqq eyeqq 2008-10-10 13:36

    [quote]QBC是啥
    不懂哈,请详细说明
    Criteria我查了些资料,都说得不明不白的,实在是没搞懂[/quote]
    QBC就是query by criteria。
    就是通过criteria来查询。你有没有看上面的语句,也你的零乱的HQL是不是整洁多了。
    http://www.souzz.net/html/edu/jsp/J2EE/7193.html
    帮你找了一个。你看看吧。
    另外讲一下,你用判断是很差劲的。
    多余出来太多的代码。

    点赞 评论 复制链接分享
  • tantenis tantenis 2008-10-10 13:50

    我跟你说,你再怎么分页,数据量上去也不会快~~~~~~~应该会很慢很慢,比如等个几分钟

    点赞 评论 复制链接分享
  • tantenis tantenis 2008-10-10 14:13

    你用了4个like能不慢吗?like又不能用索引
    不说百万,你搞个几十万条查一下试试看

    速度就是蜗牛

    像这种很多like的搜索用全文搜索引擎来搜

    点赞 评论 复制链接分享
  • dlpater dlpater 2008-10-10 21:57

    同时取得可能需要的5个值 如果为null 用“”代替
    String hql=“select u from user as u where u.uname like /%“+传过来的name+”%/ and u.birthday like /%"+传过来的生日+"%/ and ...以此类推”

    hql语句和 sql差不多
    sql里查询的是表 例 select * from 表名
    hql查询的是对象 例 select tab from 对象名 as tab(tab是给对象取的别名)

    sql里还查询表里的列 select * from 表名 where 列明=‘xxx’
    hql里查询对象的属性 select tab from 对象名 as tab where tab.属性名

    hql里不能用sql里的聚合函数 比如 avg() sum()等。。。。
    这是我所知道的 不详细的请其它人补充~~~

    点赞 评论 复制链接分享
  • eyeqq eyeqq 2008-10-11 08:45

    就查个User嘛,干嘛还要用lucence。杀鸡焉用牛刀?!
    关联查询?不是没有,是你没认真看过而以。
    孙卫琴有本叫《精通Hibernate:javaxxxxxxxx》难得的好书。你可以找来看看,现在的问题里面都会有解答。

    点赞 评论 复制链接分享

相关推荐