我想更好的解决hibernate模糊查询问题,我用本来的pojo对象作为查询条件的传递对象。/**
 * 利用反射来拼接HQL
 * @param object
 * @param propertyFilter 过滤不用拼接的字段
 * @return
 */
public static String getQueryHql(Object object,String[] propertyFilter){
Field[] fields = object.getClass().getDeclaredFields();
StringBuffer where = new StringBuffer();
for(Field field : fields){
field.setAccessible(true);
if(field.getType() == Collection.class
|| field.getType() == Set.class
|| field.getType() == Map.class
|| field.getType() == List.class) {
//过滤掉集合
continue;
}else if(field.getType()==Date.class){
//处理日期,写的比较死,查询对象要有startindate与endindate字段。
try {
Field sfield = object.getClass().getDeclaredField("startindate");
sfield.setAccessible(true);
Field efield = object.getClass().getDeclaredField("endindate");
efield.setAccessible(true);
if(sfield.get(object)!=null){
where.append(" and to_char("+field.getName()+",'yyyy-MM-dd hh:mm:ss') >= :startindate");
}
if(efield.get(object)!=null){
where.append(" and to_char("+field.getName()+",'yyyy-MM-dd hh:mm:ss') >= :endindate");
}
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SecurityException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (NoSuchFieldException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}else if(hasInArray(propertyFilter,field.getName())){
continue;
}else{
try {
if(field.getType()==String.class&&field.get(object)!=null&&!"".equals(field.get(object))){
where.append(" and "+field.getName()+" like :"+field.getName());
}else if(field.getType()==Long.class&&field.get(object)!=null){
where.append(" and "+field.getName()+" = :"+field.getName());
}
else{
continue;
}
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}

return where.toString();
}/**
 * 模糊查询对象
 * 将对象所有字符类型字段变成'%property%'
 * @param object
 * @param propertyFilter
 * @return
 */
public static Object getQueryObject(Object object,String[] propertyFilter){
Field[] fields = object.getClass().getDeclaredFields();
for(Field field : fields){
field.setAccessible(true);
if(field.getType() != String.class) {
continue;
}else if(hasInArray(propertyFilter,field.getName())){
continue;
}else{
try {
if(field.get(object)!=null&&!"".equals(field.get(object))){
field.set(object,"'%"+field.get(object)+"%'");
}else{
continue;
}
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}

return object;
}然后我如下调用方法。public int getPaidConnt(TbFeePaid feePaid){
                //feePaid 中的值是查询条件,前台表单传过来的。
int count=0;
try {
Session session = getSession();
TbFeePaid queryPaid =(TbFeePaid) DataUntil.getQueryObject(feePaid, new String[]{"sindate","startindate","endindate"});//将字符串字段变成'%value%'
StringBuffer hql = new StringBuffer("select count(*) from TbFeePaid where 1=1");
hql.append(DataUntil.getQueryHql(feePaid,new String[]{"sindate","startindate","endindate"}));//过滤3个字段
Integer count1 = (Integer)session.createQuery(hql.toString())
.setProperties(queryPaid)
.uniqueResult();
count = count1.intValue();
} catch (Exception e) {
e.printStackTrace();
} finally {
closeSession();
}
return count;
}当我不把字段变成'%value%'这样 ,可以查出来,但是不是模糊查询,是等号的效果。变成'%value%'这样,用query.setProperties() 这个方法好像没有,setParameter(1,"'%"++"%'")这样的效果啊?

解决方案 »

  1.   

    我控制台显示的hql语句是这样的  select count(*) as col_0_0_ from UZMAX.TB_FEE_PAID tbfeepaid0_ where 1=1 
    and (tbfeepaid0_.PAYERTYPE like ?) 
    and tbfeepaid0_.MONEY=?
    and (tbfeepaid0_.PAYTYPE like ?) 
    and (tbfeepaid0_.ACT like ?);
      

  2.   

    既然都学hibernate了,就再学学hibernate的条件查询吧,criteria.
      

  3.   

    criteria 这个同样解决不了
      

  4.   

    类似于 session.createCriteria().add(Example.create(instance)) 不过这个是相等,我要模糊查询的
      

  5.   

    用preparedStatement对应的那个
    setString(1,"%"+param+"%");
    可以
      

  6.   

    你那样不是我想要的嘛。要set好多  好麻烦。
      

  7.   

    解决了,query.setProperties()  这个方法是将对象中的参数当成字符来处理的,如果是'%value%',生成的语句会变成''%value%'',所以我设置成  field.set(object,"%"+field.get(object)+"%");  就好了,应该是这样。