现在我帮老师做一个图书在线商城.我期中有一个子模块是图书高级搜索.期中从页面拿回来的5个参数都是进行模糊搜索的.(like ) 会员也可以只对一个字段进行搜索.相信大家也明白.就像当当高级搜索一样.可以所有关键字都填了.也可以任意填写期中的参数进行高级搜索.现在我写了一个sql语句生成类.如果页面拿回来的字段是空的.那我就不生成那个字段的搜索关键字例如 from Book book where 1=1 and book.bookName like '%?%'and book.author like '%?%'
如果会员只填写了书名.那sql只会生成from Book book where 1=1 and book.bookName like '%?%'
我现在是用Hibernate...我查询语句可以动态生成..但是我的Hibernate查询架构session.createSQLQuery().setString()...list()无法动态生成的.还有一个头痛的地方...所有字段都不是string的有些是Integer和Float需要转换.请问高手们我应该用什么方法解决高级搜索?

解决方案 »

  1.   

    你的查询语句是写死了的,应该是根据前台输入的查询条件动态的把SQL语句拼起来进行模糊查询,如:
      String sql = from Book book where 1=1
    if(book.bookName !=null)
    {
      sql+=and book.bookName like '%?%'
    }你添加Struts框架,用实体类作为Form属性不就把转型解决了吗?
      

  2.   

    我没有写死.public static void main(String[] args) {
    String[] para = {"bookName","author","bookcategory.categoryId"};
    Object[] value = {123,"交友会",23.56,};
    String pojoAlias = "book";
    String pojoName = "Book";
    String dis = sqlGenerator(para,value, pojoAlias, pojoName);
    System.out.println(dis);
    }

    private static String sqlGenerator(String[] paraName, Object[] value, String pojoAlias, String pojoName) {

    StringBuffer sql = new StringBuffer("from ");

    sql.append(pojoName).append(" ").append(pojoAlias).append(" where 1=1");

    String strAnd = " and";

    String strLike = " like ";

    for (int i=0;i<paraName.length;i++) {
    if ("" != value[i] && value[i] != null) {
    sql.append(strAnd).append(" ").append(pojoAlias).append(".").append(paraName[i]).append(strLike).append("'%" + value[i] + "%'");
    }
    }

    return sql.toString();
    }现在我只能把一条构建好带值得语句传到Hibernate里面了.
      

  3.   


    Criteria cri = session.createCriteria(Book.class);if(name != null) {
       cri.add(Expression.like("name", "%" + name + "%");
    }
    if(author != null) {
       cri.add(Expression.like("author", "%" + author + "%");
    }List books = cri.addOrder( Order.asc("date") )
     .setFirstResult(0)
     .setMaxResults(10)
     .list();