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