我想更好的解决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,"'%"++"%'")这样的效果啊?
* 利用反射来拼接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,"'%"++"%'")这样的效果啊?
and (tbfeepaid0_.PAYERTYPE like ?)
and tbfeepaid0_.MONEY=?
and (tbfeepaid0_.PAYTYPE like ?)
and (tbfeepaid0_.ACT like ?);
setString(1,"%"+param+"%");
可以