在处理Hibernate的实体查询,一般可以采用多种方式处理复杂的查询,比如HQL的灵活使用,Query的外部参数化赋值等。但是,对于IN字句在sql中的处理,也会出现,不过,一般不建议使用这样的sql处理,转而采用关联条件来处理这种查询。
一般对于可变参数传入在in字句中,大概有下面几种总结的方法:
1、直接外面拼转sql,这种拼sql的方式容易出现sql注入,比如in(123,drop table ttt,),而且如果in字句字符串太多,也会受限的,所以一般不赞成使用。
2、进一步解决上面的问题就是拼赋值sql,采用预处理处理,比如Select * from tab t where t.id in(?,?,?....),参数一并传入就行额。缺点还是受限于要包含的那些记录数据量。
3、一般在hibernate处理这个也比较方便,采用显示参数传递赋值,如 :
String sql = from Task t where t.id(:ids)
Dao层处理也方便:
Query query = Session.getQuery(sql);
query.setParamList("ids",List);
大概处理方式就是这样,但数据量多也有一定缺陷。
4、建议系统中出现的in处理,直接采用关联查询处理,in字句本来性能就差,没做好就是是全表扫描。