平时经常用Hibernate,由于习惯表间不建立关联,所以HQL查询时候经常要用in语句。

由于表间没有建立外键的关联关系所以使用in是最常见的代替使用对象po中的set。

但是在写hql时如果在new object()对象的前面写上distinct关键字是可以去掉重复记录的,完全不必考虑使用in排除重复记录,但是在本公司框架中前台的ecside获得记录总数时调用的方法中,获得记录总数代码如下:

public Page findBy(String query, PageInfo pageInfo)
  {
    String countQuery = "select count(*) " + HqlRemoveUtils.removeSelect(query);
    return findBy(query, countQuery, pageInfo);
  }

public static String removeSelect(String hql)
  {
    Assert.hasText(hql);
    int beginPos = hql.toLowerCase().indexOf("from");
    Assert.isTrue(beginPos != -1, " hql : " + hql + " must has a keyword 'from'");
    return hql.substring(beginPos);
  }

可以看到其获得记录总数是从from后面截取hql然后重组hql才获得记录总数的,此时在new前面加上distinct关键字虽然获得的记录是对的,但是在前台的ecside中的记录总数是错误的。

为了避免这种bug不用distinct而使用in关键字。这样就可以不用关联其他表避免造成多条重复记录的情况,而是使用子查询通过where中的条件使用in限制查询条件,排除重复记录

使用distinct的代码如下:

String sql = "select distinct new com.luguang.product.model.LgpProductVo(a.lgpProductId,a.productName,a.productNum,d.userAlias,a.productLeader,a.productGoal,a.description,a.accessControl,'')  from LgpProduct  as a , LgmUser as d , LgpProjectGroup as e   where 1=1 "
    +" and a.productLeader=d.userId"
    +" and ((a.lgpProductId=e.lgpProductId "
    +" and e.userId='"+userId+"'"
    +" )or a.accessControl=0)"
       + "/~ and a.productName = '[productName]' ~/"
    + "/~ and a.productNum = '[productNum]' ~/"
    + "/~ and d.userId = '[productLeader]' ~/"
    + "/~ and a.accessControl = '[accessControl]' ~/"
    + "/~ order by [sortingColumn] [sortingDirection] ~/";

使用in的代码如下:

String sql = "select distinct new com.lg.product.model.LgpProductVo(a.lgpProductId,a.productName,a.productNum,d.userAlias,a.productLeader,a.productGoal,a.description,a.accessControl,'')  from LgpProduct  as a , LgmUser as d   where 1=1 "
    +" and a.productLeader=d.userId"
    +" and ((a.lgpProductId in (select e.lgpProductId from LgpProjectGroup as e where e.userId='"+userId+"') "
    +" )or a.accessControl=0)"
       + "/~ and a.productName = '[productName]' ~/"
    + "/~ and a.productNum = '[productNum]' ~/"
    + "/~ and d.userId = '[productLeader]' ~/"
    + "/~ and a.accessControl = '[accessControl]' ~/"
    + "/~ order by [sortingColumn] [sortingDirection] ~/";

以后处理重复记录时尽量采用in的形式(针对公司框架目的是避免在ecside中的记录总数中产生错误的记录统计数量),原始的hibernate框架中使用distinct较为简单可靠。

我最常用的情况有2种:

1、in后是个子查询,如 FROM A WHERE A.ID IN (SELECT B.AID FROM B WHERE ...),这样是没问题的,如果A.ID 和B.AID是相同的数据类型。

2、in的参数如果已知了,可以直接拼接在后面 如FROM A WHERE A.ID IN (1,2,3,4...)。

3、上面的情况下,通常(1,2,3,4...)都是作为参数传递过来的,可能是数组或者List。

假设List<Integer> a;a里面已经有数据了,则HQL查询条件可以为:

  1. String hql="FROM A WHERE A.ID IN (:alist)";
  2. Query query = getSession().createQuery(hql);
  3. query.setParameterList("alist", a);
String hql="FROM A WHERE A.ID IN (:alist)";
Query query = getSession().createQuery(hql);
query.setParameterList("alist", a);

另外,query.setParameterList中的第二个参数,还可以是数组类型,如int[] a,不要被方法名称迷惑。我也是最近刚学会的这种in参数设置。

hql中in的用法的更多相关文章

  1. hql中or的用法(代替union)

    hql中不支持union和unionAll关键字因为在查询出的结果集中无法进行排序.代替union起到相同作用的 是or关键字.在构造hql时考虑使用or代替union产生多个结果集的组合. 详解如下 ...

  2. HQL查询——HQL查询的基本用法

    HQL查询--HQL查询的基本用法 1.HQL语法类似于SQL语法,但是需要注意的是,HQL是一种完全面向对象的查询语言.SQL语言操作的对象是数据表.列等数据库对象,而HQL语言的操作对象是类.实例 ...

  3. [转载]C#中MessageBox.Show用法以及VB.NET中MsgBox用法

    一.C#中MessageBox.Show用法 MessageBox.Show (String) 显示具有指定文本的消息框. 由 .NET Compact Framework 支持. MessageBo ...

  4. C#中string.format用法详解

    C#中string.format用法详解 本文实例总结了C#中string.format用法.分享给大家供大家参考.具体分析如下: String.Format 方法的几种定义: String.Form ...

  5. SQL中distinct的用法

    SQL中distinct的用法   1.作用于单列 2.作用于多列 3.COUNT统计 4.distinct必须放在开头 5.其他 在表中,可能会包含重复值.这并不成问题,不过,有时您也许希望仅仅列出 ...

  6. Oracle 中 decode 函数用法

    Oracle 中 decode 函数用法 含义解释:decode(条件,值1,返回值1,值2,返回值2,...值n,返回值n,缺省值) 该函数的含义如下:IF 条件=值1 THEN RETURN(翻译 ...

  7. jQuery中Animate进阶用法(一)

    jQuery中animate的用法你了解多少呢?如果仅仅是简单的移动位置,显示隐藏,哦!天哪你在浪费资源!因为animate太强大了,你可以有很多意想不到的用法!让我们一起研究一下吧~~ 首先要了解j ...

  8. [转载]js中return的用法

    一.返回控制与函数结果,语法为:return 表达式; 语句结束函数执行,返回调用函数,而且把表达式的值作为函数的结果 二.返回控制,无函数结果,语法为:return;  在大多数情况下,为事件处理函 ...

  9. js中this的用法

    经过近几周的模拟面试题,我查询了一些资料,今天就来说说,在js中this的用法吧.方法有四:第一,用作全局变量,第二,用作表该对象,第三,用作构造函数,第四,用作call和applay

随机推荐

  1. PPT 制作必备工具

    1.图标 http://www.easyicon.net/ http://ico.58pic.com/ http://www.iconpng.com/ 2.字体 http://www.qiuziti. ...

  2. GPS坐标转换

    由于经常涉及到GPS程序的编写,现在貌似这个GPS是越来越火,越来越多的朋友在编写GPS程序,估计是个人都会遇到这个GPS坐标转换的问题,很惭愧的是,作为一个测量专业出身的学生,我还得时不时的要把这些 ...

  3. QT中嵌入SDL

    原地址:http://www.qtcn.org/bbs/read.php?tid=23926 前段时间在做一个音视频编码板卡的PC跨平台程序,使用QT框架,其中有块功能是往QT里嵌入SDL,来播放YU ...

  4. COCI 2015/2016 Day 8 PROKLETNIK

    PROKLETNIK 题目描述:给出\(n\)个数,定义一段连续的数为魔法串是该区间的左右端点值正好是区间的最小值与最大值(最小值可以在左也可以在右,最大值也一样).\(Q\)个询问,每次询问一个区间 ...

  5. poj 3287 The Trip, 2007_贪心

    题意:把一个包放入另一个包内,使得总共要带的件数最少,就是说大包可以装小包,且一个大包只能装一个小包,但是这个小包可以继续装更小的包. 思路:因为相同大小的包不能互相装,所以最小数量就是有相同尺寸的包 ...

  6. 【LeetCode练习题】Reverse Linked List II

    Reverse Linked List II Reverse a linked list from position m to n. Do it in-place and in one-pass. F ...

  7. C语言 EOF是什么?

    Linux中,在新的一行的开头,按下Ctrl-D,就代表EOF(如果在一行的中间按下Ctrl-D,则表示输出"标准输入"的缓存区,所以这时必须按两次Ctrl-D):Windows中 ...

  8. Quartz框架的使用

    专用词汇:scheduler:任务调度器trigger:触发器,用于定义任务调度时间规则job:任务,即被调度的任务misfire:错过的,指本来应该被执行但实际没有被执行的任务调度 Quartz核心 ...

  9. #include <amp.h>

    parallel_for_each(av.extent, [=](concurrency::index<1>idx)restrict(amp) {av[idx] += 1; }); //[ ...

  10. javascript第十八课:windowd对象的方法

    window.confirm('确定删除吗?'); //当用户点击一个按钮出发一个事件的时候,弹出一个提示框让网友确认,返回一个bool值,点确定的话,返回true,点取消,返回flase windo ...