hibernate下的子查询

昨天在用hibernate做项目的时候,发现一个bug。就是发现在用Restrictions.in()函数的时候,当in里面的表达式超过1000的时候就会报错。因为在oracle数据库里面,默认括号里面的表达式是不能超过1000.如果是用纯sql语句的话问题可能还是比较好解决的,因为我可以拼接sql。但是我在想hibernate作为一个这么成熟的持久层框架不可能没有考虑到这个问题的啊。后面经过查找资料和老板的帮助,终于找到了解决的方法。那就是在hibernate里面。查询都是先建立一个DetachedCriteria或者一个Criteria,前者是离线的,后者是在线的。我选择的是前者的离线的方式。我的查询是基于一个客户表和一个资源表的。在资源表里面有一个外键customer_id是客户表的主键。我开始的想法是先根据customer_name查询出来一个customer的list对象,然后用Restrictions.in()去查询,开始没有什么问题,但是当我模糊查询的时候等到的list的size大于1000的时候就开始出现错误了。后面查找才知道在oracle里面in厘米的表达式不能超过1000.后面我就开始想办法解决,但是网上的基本都是一些sql拼接的方式,我想要的是一种hibernate里面的方式。后面在老板的提醒下想到了hibernate下面的子查询的方式。所以我就直接用了criteria.add(Restrictions.like("customer.cnName", customerName));。但是后来发现还是不可以。总是报错说Customer类没有customer.cnName这个属性。后面通过查找资料才知道要想进行此类的子查询就要在创建一个DetachedCriteria。就是在原来的DetachedCriteria的基础上创建一个。criteria.createCriteria( "customer" ).add( Restrictions.like( "cnName" , customerName , MatchMode.ANYWHERE ) );如上所示。这种方式可以无限循环下去。那么就代表可以进行多层外键的子查询。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值