【问题标题】:JSP search in more tables in databaseJSP在数据库中的更多表中搜索
【发布时间】:2013-12-05 17:32:37
【问题描述】:

使用这个 search.jsp,它会找到用户搜索的所有单词,然后删除重复的找到的用户并显示找到的匹配列表。

我只能搜索用户的电子邮件、名字、姓氏、用户名,但我还想搜索技能,并显示与找到的技能匹配的用户。

例如我搜索用户名;管理员,它找到管理员并显示 结果中的这个人。这现在有效,但我也想要这个;;;如果 我搜索 Java,然后我希望每个有 Java 技能的人都能 显示在结果中。

我知道使用 SQL 查询更容易,但这是不同的。 我在下面提供了模型和数据库信息;

数据库:

**Table name: User**
userId
emailAddress
firstname
lastname
username

**Table name: user_skill**
User_userId
skills_skillId

**Table name: skill**
skillId
name

这一切发生在哪里: : : search.jsp:

@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {
    System.out.println("Hij komt er in");

    //get the action
    String uri = request.getRequestURI();
    String action = uri.substring(uri.lastIndexOf("/") + 1);

    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();
}

model.user.java:

@Entity
public class User implements Serializable{

    @Id
    @GeneratedValue
    private int userId;
    private String username, firstname, lastname, emailAddress, position, password;
    private String fullName;
    private boolean isAdmin;

    @ManyToMany
    private List<Skill> skills;

    public User(){

    }

model.skill.java:

@Entity
public class Skill implements Serializable {

    @Id
    @GeneratedValue

    private long skillId;
    @Column(columnDefinition = "varchar(25)")
    private String name;
    @Column(columnDefinition = "varchar(25)")
    private String level;
    @Column(columnDefinition = "varchar(250)")
    private String description;

    public Skill() {
    }

【问题讨论】:

    标签: java sql jsp


    【解决方案1】:

    在技能中添加连接,在查询中添加 or 子句:

    select distinct u from User u
    left join u.skills skill
    where ... (existing or clauses)
    or skill.name like :param
    

    此外,您的代码容易受到 SQL 注入攻击,如果参数包含单引号,则会失败。使用如上所示的命名参数。

    【讨论】:

    • 以上是查询应该是什么样子的示例。您不应该从我的答案中复制和粘贴任何内容。您可以在一个地方在代码中编写 HQL 查询。因此,您应该将联接和附加的 where 子句添加到此查询中。花一些时间阅读 HQL 文档以了解连接的工作原理。
    • 尝试使用调试模式理解代码。您将看到查询是如何逐步构建的,以及应该在哪里添加“左连接”部分。 JB 是对的,查询是不安全的。您必须使用 query.setParameter() 来保护每个参数。见那里的例子:stackoverflow.com/questions/16251491/….
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-12-19
    • 1970-01-01
    • 1970-01-01
    • 2018-09-12
    • 2019-07-05
    • 1970-01-01
    • 2016-07-20
    相关资源
    最近更新 更多