多对多条件下的一条复杂的HQL的语句

     最近遇到一个烦人的问题,费了不少时间才解决出来,把它贴出来分享!
     问题如下:
     产品对象TProduct和标签对象TTag,是通过中间表连接的双向多对多关联关系,要求是列出所有的标签,按标签的使用次数倒排序(即哪个标签关联的产品数最多,哪个标签放在第一个).
    省略掉pojo的代码,其映射文件如下:
    ----------------------TProduct.hbm.xml-----------------------
xml 代码
  1. <id name="id" type="integer" column="id">  
  2.   <generator class="native"/>  
  3. id>  
  4. <property name="name" column="name" type="string" not-null="false" length="50"/>  
  5. <set name="tags" table="TableLink_Product_Tags" order-by="tagId">  
  6.   <key column="productId"/>  
  7.   <many-to-many column="tagId" class="TTag"/>  
  8. set>  

------------------------TTag.hbm.xml-------------------------
xml 代码
  1. <id name="id" type="integer" column="id">  
  2.   <generator class="native" />  
  3. id>  
  4. <property name="name" column="name" type="string" />  
  5. <set name="products" table="TableLink_Product_Tags">  
  6.   <key column="tagId" />  
  7.   <many-to-many class="TProduct" column="productId" />  
  8. set>  

条件很简单,就这么多,要求列出所有的标签,按照其关联的产品的数量倒排序(即标签使用次数倒排序),难就难在其排序上,

java 代码
  1. select   t  from TTag as t order by t.products.size desc   

这样的写法肯定是不行的,生成的sql语句是错误的!

正确的写法如下:

java 代码
  1. select a from TProduct  as t inner join t.tags as a group by a.id,a.name order by count(t.id) desc  


这种写法才是正确的.

这个问题看起来简单,写起来麻烦,如果用sql写,我觉得还是比较好写的,而用hql来写,感觉有点抽象,大家还有别的实现方法么?

此外,还发现了一个sql语句的小特点,这个不能算问题,只是比较容易产生错误!

看这个sql语句:

select * from Table_Tag where id in(8,7,6,3,9)

这样得出的结果其顺序又会如何呢?

其实这么写的结果的显示顺序并非:8,7,6,3,9

应该是:3,6,7,8,9

所以为了追求结果排序,where id in()这个想法是不可取的

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值