[英]JSP search database
場景1:用戶想要找到管理員,誰的名字是jan。 他輸入'admin jan'或'jan admin'。 然后結果應該是:如果數據庫中有'jan'和'admin'的用戶,它將顯示該用戶。 即使有10個人在他們的電子郵件,街道名稱或其他內容中使用'jan'和'admin',它也應該顯示出來。 場景2:用戶希望找到具有'HQL PHP bebe SQL JAVA'技能的名為'bebe'的人。 它應該在數據庫中向每個用戶顯示這些單詞。 所以它應該只顯示具有這些技能和名稱的用戶,所以如果其他人沒有技能HQL,但確實具備PHP SQL JAVA技能,請不要顯示這一點。
我只搜索最后一個字。 因此,如果我搜索“這就是PHP SQL ADMIN”,它只會找到所有擁有ADMIN的人並忽略String的其余部分。
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();
}
HQL對使用的java類屬性區分大小寫。 User和class中的用戶名和名字是否完全聲明為?
可能是:
"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();
}
試試這個以避免重復的值(未測試 ):
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();
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.