现在需做一个查询。
比如有3个条件。
1,2,3
if(1!=null||2!=null||3!=null)
{
if(1!=null||2!=null)
{
.....
}else if(1!=null||3!=null)
{
...
}else if(2!=null||3!=null){
.........
}else if(1){
..........
}else if(2){
........
}else if(3){
.........
}
}
有三个条件只能这么判断吗?
1,2,3
1,2
1,3
2,3
1
2
3如果我有10个条件呢?
是不是就要写
1,2,3,4,5,6,7,8,9,10晕,那就大了,有什么好办法,大家给支个招
比如有3个条件。
1,2,3
if(1!=null||2!=null||3!=null)
{
if(1!=null||2!=null)
{
.....
}else if(1!=null||3!=null)
{
...
}else if(2!=null||3!=null){
.........
}else if(1){
..........
}else if(2){
........
}else if(3){
.........
}
}
有三个条件只能这么判断吗?
1,2,3
1,2
1,3
2,3
1
2
3如果我有10个条件呢?
是不是就要写
1,2,3,4,5,6,7,8,9,10晕,那就大了,有什么好办法,大家给支个招
select * from sys_menu where parent_name like'1';
如果2等于空,执行2的话那就直接查询不出来了。
1,2
select * from sys_menu where parent_name like'1' and neme like'2';
select * from sys_menu where parent_name like'1' and neme like'2' and 123 like'3';
....
{
if(1!=null||2!=null)
{
.....
}else if(1!=null||3!=null)
{
...
}else if(2!=null||3!=null){
.........
}else if(1){
..........
}else if(2){
........
}else if(3){
.........
}
}
难道我就不能避免这种判断?有没有好办法?
如果有N种我怎么写。
public List<T> getListByQuery(Object query)
throws IllegalAccessException, IllegalArgumentException {
// TODO Auto-generated method stub
if (query == null) {
return this.getList();
} else {
String queryString = prepareQueryString(query);
return getHibernateTemplate().find(queryString);
}
} /**
* 利用反射机制返回查询字符串
*
* @param query
* 查询参数
* @return 查询字符串
*/
protected String prepareQueryString(Object query)
throws IllegalAccessException, IllegalArgumentException {
StringBuffer sb = new StringBuffer();
if(query == null){
return "from " + type.getName();
}else{
Class tempClass = query.getClass();
sb.append("from ");
sb.append(type.getName() + " as _qc");
sb.append(" where 1=1");
Field[] fields = tempClass.getDeclaredFields();
for(Field f : fields){
if(f.get(query) != null){
sb.append(" and _qc.");
sb.append(f.getName() + " like '");
sb.append(f.get(query) + "%'");
}
}
}
return sb.toString();
}
}
这个是我以前写得,用的反射,其中的type声明为
Class<T> type;
public class BaseDaoHibernate<T, PK extends Serializable> extends
HibernateDaoSupport implements BaseDao<T, PK> { private Class<T> type; public BaseDaoHibernate(Class<T> type) {
this.type = type;
} /*
* (non-Javadoc)
*
* @see edu.zsu.fbfz.clic.dao.BaseDao#create(java.lang.Object)
*/
public PK create(T newInstance) {
return (PK) getHibernateTemplate().save(newInstance);
} /*
* (non-Javadoc)
*
* @see edu.zsu.fbfz.clic.dao.BaseDao#delete(java.lang.Object)
*/
public void delete(T transientObject) {
getHibernateTemplate().delete(transientObject);
} /*
* (non-Javadoc)
*
* @see edu.zsu.fbfz.clic.dao.BaseDao#read(java.io.Serializable)
*/
public T read(PK id) {
return (T) getHibernateTemplate().get(type, id);
} /*
* (non-Javadoc)
*
* @see edu.zsu.fbfz.clic.dao.BaseDao#update(java.lang.Object)
*/
public void update(T transientObject) {
getHibernateTemplate().update(transientObject);
} public List<T> getList() {
// TODO Auto-generated method stub
String className = type.getName();
return (List<T>) getHibernateTemplate().find("from " + className);
} public List<T> getListByQuery(Object query)
throws IllegalAccessException, IllegalArgumentException {
// TODO Auto-generated method stub
if (query == null) {
return this.getList();
} else {
String queryString = prepareQueryString(query);
return getHibernateTemplate().find(queryString);
}
} /**
* 利用反射机制返回查询字符串
*
* @param query
* 查询参数
* @return 查询字符串
*/
protected String prepareQueryString(Object query)
throws IllegalAccessException, IllegalArgumentException {
StringBuffer sb = new StringBuffer();
if(query == null){
return "from " + type.getName();
}else{
Class tempClass = query.getClass();
sb.append("from ");
sb.append(type.getName() + " as _qc");
sb.append(" where 1=1");
Field[] fields = tempClass.getDeclaredFields();
for(Field f : fields){
if(f.get(query) != null){
sb.append(" and _qc.");
sb.append(f.getName() + " like '");
sb.append(f.get(query) + "%'");
}
}
}
return sb.toString();
}
}
Map<String, Object> map=new HashMap<String, Object>();
String sql = " from TableName where 1=1";
if(第一个条件成立){
map.put("字段名",值);
}
if(第N个条件成立){
map.put("字段名",值);
}
if(map !=null && map.size()>0){
Object key, value;
Iterator it = map.entrySet().iterator();
while (it.hasNext()) {
Map.Entry entry = (Map.Entry) it.next();
key = entry.getKey();
value = entry.getValue();
sql+=" and " + key + "=" + value;
}
最后招待:sql语句!
}
Map<String, Object> map=new HashMap<String, Object>();
String sql = " from TableName where 1=1";
if(第一个条件成立){
map.put("字段名",值);
}
if(第N个条件成立){
map.put("字段名",值);
}
if(map !=null && map.size()>0){
Object key, value;
Iterator it = map.entrySet().iterator();
while (it.hasNext()) {
Map.Entry entry = (Map.Entry) it.next();
key = entry.getKey();
value = entry.getValue();
sql+=" and " + key + "=" + value;
}
最后招待:sql语句!
}
----------------------------------------------
但是这样的话,如果你需要增加一个条件,不是还要多写一个if么?用反射的话只要在查询的类里面加一个字段就可以了