JAvaにおける多条件と不定条件クエリー

4813 ワード

JAvaにおける多条件と不定条件クエリー
ウェブサイトあるいは各类の管理システムはすべて検索を使って、1つあるいは多くの不确定な条件の検索を使って、単条件の検索は比较的に简単で、时には多くの条件が共同で検索することができて、もしシステムの中ですでに関连する方法を提供してあなたに使うのが最も良いならば、私のようにこの古いシステムの改版をして、検索を追加する必要があって、自分で书きます.最初はそんなに気にしないで、sqlをつづっていましたが、後で検索する場所が少なくないことに気づきました.いつもこのように書くのは仕事量を増やすだけでなく、多くの繰り返しの仕事をしなければなりません.後でこのような仕事をするかもしれません.だから、比較的一般的なクエリー方法を書きます.package com.test;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
import javax.annotation.Resource;
import org.apache.poi.hssf.record.formula.functions.T;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.JdbcTemplate;
import com.ams.bo.webapi.dto.Agent;
public class MultiTaskSearch {
    
    @Resource(name="jdbcTemplate")
    private JdbcTemplate jdbcTemplate;
    @Resource(name = "storeFrontDAO")
    
    private Map search() {
String name=「会社」
        String email="@163";
String invoiceTitle="会社";
        int sign=1;
        String at="2012-04-26";
        Map map=new LinkedHashMap();//追加順序の保持
//        Map map=new HashMap();//固定順序なし
        map.put("name like", name);
        map.put("email like", email);
        map.put("invoiceTitle like", invoiceTitle);
        map.put("sign =", sign);
        map.put("addtime>=", at);
        return map;
    }
    
    public  List dbSearch(Class typeClass,Map map,String orderby) {
        String paths[] = { "ams-servlet.xml" };
        ApplicationContext ctx = new ClassPathXmlApplicationContext(paths);
        jdbcTemplate = (JdbcTemplate)ctx.getBean("jdbcTemplate");
        
        List TList=null;
        String tablename = typeClass.getName().substring(
                typeClass.getName().lastIndexOf(".") + 1);
        StringBuffer sql=new StringBuffer("select * from ");
        sql.append(tablename);
        if (map.size()!=0) {
            sql.append(" t where 1=1");//後はand条件をつなぐだけ
        }
        Set> set=map.entrySet();
        Iterator iterator=set.iterator();
        for (int i = 0; i 
            Map.Entry mapEntry=(Entry) iterator.next();
            if (!"".equals(mapEntry.getValue().toString())) {
                
//ファジイマッチング
                if (mapEntry.getKey().toString().contains("like")) {
//                sql.append(" and t."+mapEntry.getKey()+" "+mapEntry.getValue()+" ");
                    sql.append(" and t."+mapEntry.getKey()+" '%"+mapEntry.getValue()+"%'");
//正確な照合
                }else {
//                sql.append(" and t."+mapEntry.getKey()+" '%"+mapEntry.getValue()+"%'");
                    sql.append(" and t."+mapEntry.getKey()+" "+mapEntry.getValue()+" ");
                }
            }
        }
        if (null!=orderby&&!"".equals(orderby)) {
            sql.append(orderby);
        }
        System.out.println("SQL:"+sql.toString());
        TList=jdbcTemplate.query(sql.toString(),new Object[] {}, new BeanPropertyRowMapper (typeClass));
        
        return TList;
    }
    public static void main(String[] args) {
        MultiTaskSearch mt=new MultiTaskSearch();
        Map map=mt.search();
        String orderby=" order by addTime desc";
        List agents=mt.dbSearch(Agent.class, map,orderby);
        for (Agent agent : agents) {
            System.out.println(agent.getName());
        }
        System.out.println("****************"+agents.size());
        
    }
} sql
Unionキーを使用すると、1つのテキストボックス内で複数の条件のデータを検索できます.
select  t1.* from
(
select *  from agent where name like '"2%' 
union 
select *  from agent where email like '"2%' 
union 
select *  from agent where ContactPerson like '"2%'
) t1
このクエリの結果はすべての集合であり,unionをorに置き換えることもできる.
 
私は个人的にテストに使って、参考にして、もし読者が问题があると感じたら、私に伝言を残して交流することができます.
 
転載先:https://www.cnblogs.com/xm1-ybtk/p/4966470.html