【问题标题】:JSP search databaseJSP 搜索数据库
【发布时间】:2013-12-19 21:40:13
【问题描述】:

场景1:用户想找管理员,他的名字是jan。他输入“admin jan”或“jan admin”。那么结果应该是:如果数据库中有一个用户为“jan”和“admin”,它将显示该用户。即使有 10 个人在他们的电子邮件、街道名称或其他名称中带有“jan”和“admin”,它也应该显示他们。 场景 2:用户想要找到一个名叫“bebe”的人,他的技能是“HQL PHP bebe SQL JAVA”。它应该在数据库中向每个用户显示这些单词。所以它应该只显示具有这些技能和名称的用户,所以如果其他人没有技能 HQL,但有技能 PHP SQL JAVA,请不要显示这个。

我只搜索最后一个单词。因此,如果我搜索“THIS THAT THOSE PHP SQL ADMIN”,它只会找到所有使用 ADMIN 的人,而忽略字符串的其余部分。

if (action.equals("searchUser")) {
    Session session = HibernateUtil.getSessionFactory().openSession();
    String searchQuery = request.getParameter("searchQuery");
    String[] query = searchQuery.split(" ");

    for (int i = 0; i < query.length; i++) {
        String hql = "FROM User WHERE username LIKE '%" + query[i] + "%' OR firstname LIKE '%" + query[i] + "%' OR lastname LIKE '%" + query[i] + "%' OR emailAddress LIKE '%" + query[i] + "%'";

        List<User> result = session.createQuery(hql).list();
        //set our results on the request and redirect back
        request.setAttribute("users", result);
        request.setAttribute("usersSize", result.size());
        request.setAttribute("usersSizeResults", result.size());

        System.out.println("size:" + result.size());
    }
    redirect(request, response, "/search.jsp");
    session.close();

}

【问题讨论】:

    标签: java mysql sql jsp search


    【解决方案1】:

    尝试这样做以避免重复值(未测试):

    public void searchUser() {
    if (action.equals("searchUser")) {
        Session session = HibernateUtil.getSessionFactory().openSession();
        String searchQuery = request.getParameter("searchQuery");
        String[] params = searchQuery.split(" ");
    
        // Found users
        List<User> usersFound = new ArrayList<User>();
    
        // Exact match
        String hqlMatch = this.getSearchHqlQuery(params, "AND");
        List<User> exactResult = session.createQuery(hqlMatch).list();
        if (exactResult!=null && !exactResult.isEmpty()) {
            usersFound.addAll(exactResult);
        }
        // Multiple search
        else {
            String hqlLike = this.getSearchHqlQuery(params, "OR");
            List<User> likeResult = session.createQuery(hqlLike).list();
            if (likeResult!=null && !likeResult.isEmpty()) {
                usersFound.addAll(likeResult);
            }
        }
    
        System.out.println("size:" + usersFound.size());
            // set our results on the request and redirect back
            request.setAttribute("users", usersFound);
            request.setAttribute("usersSize", usersFound.size());
            request.setAttribute("usersSizeResults", usersFound.size());
    
            redirect(request, response, "/search.jsp");
            session.close();
        }
    }
    
    private String getSearchHqlQuery(String[] params, String andOrfilter) {
        StringBuilder hql = new StringBuilder();
        hql.append("from User ");
        if (params.length > 0) {
            hql.append("where ");
            for (int i = 0; i < params.length; i++) {
                if (i > 0) { hql.append(andOrfilter); }
                hql.append(" (username like '%").append(params[i]);
                hql.append("%' OR firstname like '%").append(params[i]);
                hql.append("%' OR lastname like '%").append(params[i]);
                hql.append("%' OR emailAddress like '%").append(params[i]);
                hql.append("%') ");
            }
        }
        return hql.toString();
    }
    

    【讨论】:

    • 谢谢,这就行了!这个真是高级又难哈哈
    • 再次感谢代码,它工作得很好,但也许你可以帮忙; stackoverflow.com/questions/20406778/… ?因为您已经创建了代码,并且对此非常了解,也许您也可以提供帮助?谢谢:D
    【解决方案2】:

    HQL 对使用的 java 类属性区分大小写。用户名和名字是否在 User 类中完全声明为 this?

    可能是:

    "FROM User WHERE (userName LIKE '%jan%' OR firstName LIKE '%jan%' OR lastName LIKE '%jan%' OR emailAddress LIKE '%jan%')"
    

    小心你的 foreach 循环:你对列表的每个参数进行查询。而且您只发送响应中的最后一个结果。那正确吗??

    可能是:

        if (action.equals("searchUser")) {
            Session session = HibernateUtil.getSessionFactory().openSession();
            String searchQuery = request.getParameter("searchQuery");
            String[] query = searchQuery.split(" ");
    
            List<User> usersFound = new ArrayList<User>();
            for (int i = 0; i < query.length; i++) {
                String hql = "FROM User WHERE username LIKE '%" + query[i] + "%' OR firstname LIKE '%" + query[i]
                        + "%' OR lastname LIKE '%" + query[i] + "%' OR emailAddress LIKE '%" + query[i] + "%'";
                List<User> result = session.createQuery(hql).list();
                if (result != null) {
                    usersFound.addAll(result);
                    System.out.println("size:" + result.size());
                }
            }
    
            // set our results on the request and redirect back
            request.setAttribute("users", usersFound);
            request.setAttribute("usersSize", usersFound.size());
            request.setAttribute("usersSizeResults", usersFound.size());
    
            redirect(request, response, "/search.jsp");
            session.close();
        }
    

    【讨论】:

    • 您的第一篇文章不清楚,但您更新的文章是我的答案。谢谢它很好用。它会找到我在输入搜索字段中输入的每一个
    • 一个问题.. 如果 Jan 也是 Admin,我搜索 Jan admin,它会显示 jan 两次。我可以排除一个用户的双重结果吗?
    • 我编辑了我的帖子。 foreach 是您的问题:您可以从循环中提取 request.setAttribute() 。关于区分大小写,它与类属性有关,例如“用户名”或“姓氏”。但是,如果您的查询运行良好,则无论如何。
    • 这个搜索多个词,但是有两个问题; user1: name= jan, username= adminuser2: name= bebe, username = admin。问题一是,如果我搜索 jan admin,它会在结果中显示 jan 两次。问题二是,如果我搜索 jan admin,我只想显示 jan admin,没有 bebe admin
    • 有解决办法吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-10
    • 1970-01-01
    • 2014-07-11
    • 1970-01-01
    相关资源
    最近更新 更多