Java JSP在数据库中的更多表中搜索

Java JSP在数据库中的更多表中搜索,java,sql,jsp,Java,Sql,Jsp,使用这个search.jsp,它将查找用户搜索的所有单词的匹配项,然后删除找到的重复用户,并显示找到的匹配项列表 我只能搜索用户的电子邮件、名字、姓氏、用户名,但我还想搜索技能,并显示与找到的技能匹配的用户 例如,我搜索用户名;管理员,它找到管理员并显示 结果就是这个人。这个现在可以用了,但我也想要这个;;;如果 我搜索Java,然后我希望所有拥有Java技能的人 出现在结果中 我知道使用SQL查询更容易,但这是不同的。 我提供了以下模型和数据库信息 数据库: **Table name: Use

使用这个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();
}

向技能添加联接,向查询添加or子句:

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

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

以上是查询的示例。你不应该复制粘贴我答案中的任何内容。在代码中只有一个地方可以编写HQL查询。因此,您应该将join和附加的where子句添加到此查询中。花些时间阅读HQL文档以了解联接是如何工作的。尝试使用调试模式理解代码。您将看到如何一步一步地构建查询,以及应该在何处添加“左连接”部分。如果JB是对的,那么查询是不安全的。必须使用query.setParameter()来保护每个参数。有关示例,请参见此处:。
@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() {
    }
select distinct u from User u
left join u.skills skill
where ... (existing or clauses)
or skill.name like :param