下拉框 查询 值都传过去了,在查询的时候查询语句 用 and 查不出来 用 or 可以查出来但是 却是 只要满足一个条件 就会显示数据,怎样解决 限定条件问题呢?

黛曦葛溪 发布于 2012/07/16 14:18
阅读 1K+
收藏 0
//这是分别 选择的  四个下拉框 的 值  
07-16 06:05:15.738: I/System.out(2576): ==================>>>>>喜剧,香港 ,成龙,2010 ,电影

//查询语句是
select * from Online_All where type=? or region=? or actor=? or year=? and television=?

//这样的查询语句 查询出来的  却没有限定条件   ,比如查询类型是 喜剧 然后我再选择 成龙  他就 将喜剧  全部显示出来 又将成龙的 所有电影显示出来  而不是  只显示 成龙的  喜剧电影  ,更悲催的是,选择  演员是成龙 再选则  国内  因为数据库中没有成龙 国内的电影信息  就不能显示信息  可是 他还是将成龙的 所有电影显示出来了  总之就是  用 or  根本达不到 限定条件的作用, 可是用and 有什么都查询不出来。。。   帮忙看一下  怎么解决吧。。谢谢了。。。

加载中
0
Andre.Z
Andre.Z

给你个代码片段,能看懂多少随便了

protected RpcResponse getListDatas(Map baseParams, Map likeParams,
			Map equalparams) throws ZSqlException {
		RpcResponse response = new RpcResponse();
		if (!baseParams.containsKey("size"))
			baseParams.put("size", "20");
		if (!baseParams.containsKey("page"))
			baseParams.put("page", "1");
		int size = Integer.parseInt(baseParams.get("size").toString());
		int page = Integer.parseInt(baseParams.get("page").toString());
		PagerInfo info = null;
		StringBuffer sb = new StringBuffer(this.getSelectString());
		List<Object> params = new ArrayList<Object>();
		sb.append(" where 1=1");
		DataWrapper wrapper = new DataWrapper();
		wrapper.setNeedEncode(PoolManager.getInstance().getPool(this.poolName)
				.getConfig().isNeedEncode());
		likeParams = wrapper.encodeMap(likeParams);
		Set keys = likeParams.keySet();
		String key;
		if (!keys.isEmpty()) {
			for (Iterator iterator = keys.iterator(); iterator.hasNext();) {
				key = iterator.next().toString();
				sb.append(" and " + key + " like ?");
				params.add("%" + likeParams.get(key) + "%");
			}
		}
		equalparams = wrapper.encodeMap(equalparams);
		keys = equalparams.keySet();
		if (!keys.isEmpty()) {
			for (Iterator iterator = keys.iterator(); iterator.hasNext();) {
				key = iterator.next().toString();
				sb.append(" and " + key + "=?");
				params.add(equalparams.get(key));
			}
		}
		sb.append(" " + this.getOrderString());
		ZDBUtil dbUtil = new ZDBUtil(this.poolName);
		info = dbUtil.initRecordsPagerInfo(
				"select count(*) cnt from (" + sb.toString() + ") t", "cnt",
				size, params.toArray());
		RecordSet rs = dbUtil.getRecords(sb.toString(), page, info,
				params.toArray());
		dbUtil.releaseConnToPool();
		response.setStatusCode(RpcStatus.Success.getCode());
		response.setData(rs);
		return response;
	}

查询语句是根据你参数的多少,而改变的,而不能是固定的,明白?

你要判断你的参数值,如果为空,则表示这个不加入条件中,像你开始那样,全部and,必然是失败的,因为如果传空值也算进去当然是没结果的,而or么,只要满足一个就行,不符合联合查询的要求。我上面不做判断,是因为调用之前,已经把那些垃圾参数给过滤掉了。

你的代码,要改变的,是在8--10行,动态构造语句,动态传递参数,而不是固定的语句和参数个数。语句构造么,我上面的一个for循环里面的再加上“where 1=1”就行了。你自己只要构造一个Map就行了。不管多少情况,都是一样的。

黛曦葛溪
黛曦葛溪
嗯,谢谢了!!!
0
情天大圣
情天大圣
这里是要用and来查询,是你数据库的数据本来就不满足你的and条件,所以查询不出来吧?
黛曦葛溪
黛曦葛溪
回复 @情天大圣 : 我看懂你说的了,可能是你看不懂我说的,不过我没有把sql 语句打印出来 放到 sql 工具里面执行 ,因为我用的 那工具不知道在哪放语句 而是 不用变量赋值,直接手动写固定的值了。。没有管用。。。
情天大圣
情天大圣
回复 @朱洋洋 : 无法沟通,晕!
黛曦葛溪
黛曦葛溪
回复 @情天大圣 : 还是查询不出来。。。
情天大圣
情天大圣
回复 @朱洋洋 : 你把执行查询前的SQL打印出来,也把参数打印出来,然后用参数填充SQL占位符,用此sql直接去数据库查询,看能查询出来不?
黛曦葛溪
黛曦葛溪
满足了,用 and 的时候 我是看着数据库 选择下拉框 的 还是没显示
0
Andre.Z
Andre.Z
根据你传递的参数,动态去组合sql预处理语句。
黛曦葛溪
黛曦葛溪
你要是看到了,帮我看一下我贴到下面的 这种形式 怎么动态组合处理语句吧吧。。。。谢谢了
黛曦葛溪
黛曦葛溪
不好意思,我数据库特不好,我查了好多,他们写的大部分都一样的(很多都是转载一个人的)我也看不太懂,能不能麻烦你你 帮我说一下怎么写啊?看着他们写的形式 我感觉我写过,但是都不是多条件查询的,那时候写的 是把 传过来的参数 放到String name = *.setString(1,name); String age= *.setString(2,age);...这样的形式
0
黛曦葛溪
黛曦葛溪
public List<Map<String, Object>> findMovieByType(String type,String spinnerRegion,String spinnerActor,String spinnerYear,String television,int pageNum,int numSize){
		System.out.println("==================>>>>>"+type+","+spinnerRegion+","+spinnerActor+","+spinnerYear+","+television);

		List<Map<String, Object>> movieTypeList = new ArrayList<Map<String, Object>>();
		SQLiteDatabase db = dbHelper.getReadableDatabase();
		int m  = (pageNum-1)*DbUtil.page_Num;
		
		Cursor cursor = db.rawQuery("select * from Online_All where type=? and region=? and actor=? and year=? and television=? limit ?,?",
						new String[]{String.valueOf(type),String.valueOf(spinnerRegion),String.valueOf(spinnerActor),
					String.valueOf(spinnerYear),String.valueOf(television),String.valueOf(m),String.valueOf(numSize)});
		
		while(cursor.moveToNext()){

			int num = cursor.getInt(cursor.getColumnIndex("num"));
			String name = cursor.getString(cursor.getColumnIndex("name"));
			String movieactor = cursor.getString(cursor.getColumnIndex("actor"));
			String movieregion = cursor.getString(cursor.getColumnIndex("region"));
			String movietype = cursor.getString(cursor.getColumnIndex("type"));
			String movieyear = cursor.getString(cursor.getColumnIndex("year"));
			String link = cursor.getString(cursor.getColumnIndex("link"));
			String jianjie = cursor.getString(cursor.getColumnIndex("jianjie"));
			
			HashMap<String, Object> map = new HashMap<String, Object>();
			
			map.put("moviepic", num);
			map.put("movieName", name);
			map.put("movieyear", movieyear);
			map.put("movieactor", movieactor);
			map.put("movieregion", movieregion);
			map.put("movietype", movietype);
			map.put("movietlink", link);
			map.put("jianjie", jianjie);
			
			movieTypeList.add(map);
		}
		cursor.close();
		db.close();
		return movieTypeList;
	}

0
黄龍
黄龍

明显是用and ! 你试下直接用sql 直接在数据库查吧!

给你个提示! 当你下拉框没有选择数据时,不要把条件加到sql上:

select * from Online_All where type=? or region=? or actor=? or year=? and television=?

如果你没有选地区(region),你就不要把region=? 加到上面!

 

黛曦葛溪
黛曦葛溪
回复 @HL_Simon : 呵呵。。。是的哦,我都不知道还有拼接的方法,不过你帮我看下我下面 怎么出错了吧,我把 sql.toString() 打印出来 都没有 sql 都没有拼接。。。
黄龍
黄龍
回复 @朱洋洋 : 小盆友吖!你不会在拼sql之前先判断某个下拉框有没有值吗?比如你只选了地区跟演员 就只拼这两个条件,难道你觉得把and type = '' 也拼到sql里面能去到值吗?
黛曦葛溪
黛曦葛溪
那这样的话,怎么得到 其他下拉框选择的 值呢?比如我先选择 了 类型=“喜剧” 的 这样的话 搜索出了 喜剧 但是 我又紧接着 选择了 地区 =“香港” 那么香港怎么让他 自动进入到 sql 语句里面 去做为条件呢?就算 每个下拉框 对应一个 查询的 ,但是他们得到的 值还是要穿进去的啊?
0
黛曦葛溪
黛曦葛溪
//System.out.println("==================="+sql.toString()); 打印出来还是select * from Online_All where 1=1 这句话。。。怎么回事???
StringBuilder sql = new StringBuilder("select * from Online_All where 1=1");
		if(type!=null && type.isEmpty()){
			sql.append(" and type= '").append(type).append("'");
		}
		if(spinnerRegion!=null && spinnerRegion.isEmpty()){
			sql.append(" and region= '").append(spinnerRegion).append("'");
		}
		if(spinnerActor!=null && spinnerActor.isEmpty()){
			sql.append(" and actor='").append(spinnerActor).append("'");
		}
		if(spinnerYear!=null && spinnerYear.isEmpty()){
			sql.append(" and year='").append(spinnerYear).append("'");
		}
		if(television!=null && television.isEmpty()){
			sql.append(" and television= '").append(television).append("'");
		}
		System.out.println("==================="+sql.toString());

Cursor cursor = db.rawQuery(sql.toString(), null);

0
黄龍
黄龍

 if(type!=null && !type.isEmpty())

建议你查错的时候再仔细一点吧!这点小错误.............

黛曦葛溪
黛曦葛溪
O(∩_∩)O~ 嗯,一直都没看到所以 就把 && 后面的 删了 就可以了.谢谢了。。。
0
Andre.Z
Andre.Z

这代码,我汗了,给你整理个算了

        Map<String, String> params = new HashMap<String, String>();
        params.put("type", type);
        params.put("spinnerRegion", spinnerRegion);
        params.put("spinnerActor", spinnerActor);
        params.put("spinnerYear", spinnerYear);
        params.put("television", television);
        Set<String> fields = params.keySet();
        List<String> values = new ArrayList<String>();
        StringBuilder sql = new StringBuilder(
                "select * from Online_All where 1=1");
        for (String field : fields) {
            if (params.get(field) != null && !params.get(field).isEmpty()) {
                sql.append(" and " + field + "=?");
                values.add(params.get(field));
            }
        }
        sql.append(" limit ?,?");
        values.add(String.valueOf(m));
        values.add(String.valueOf(numSize));
        Cursor cursor = db.rawQuery(sql.toString(),values.toArray(new String[0]));

居然还去组合语句,防注入呢,而且预编译和硬编码的效率差海了去?多几个参数你还不得写烦了去?我这里没得调试,凑合看吧。

Andre.Z
Andre.Z
回复 @朱洋洋 : values.toArray(new String[0])
Andre.Z
Andre.Z
回复 @朱洋洋 : rawQuery就不接受一个Object数组么???那样都不用转换了,直接toArray就好了,一般的方法都是接收Object数组的,非要String数组?
Andre.Z
Andre.Z
回复 @朱洋洋 : 不要再问这种基本的问题了好吧,受不了。
Andre.Z
Andre.Z
回复 @朱洋洋 : 唉,values.toArray(new String[values.size()])
黛曦葛溪
黛曦葛溪
回复 @Andre.Z : 它说不能转换成 String[] 07-19 02:06:47.013: E/AndroidRuntime(1291): java.lang.ClassCastException: java.lang.Object[] cannot be cast to java.lang.String[]
下一页
返回顶部
顶部