【发布时间】:2014-07-02 23:50:09
【问题描述】:
在使用 hibernate 和 JPA 的 spring mvc 应用程序中,我有一个 keyword 类,它使用户能够在底层数据库中搜索记录。 JSP 在蒲公英数据表中有一个搜索框,用户键入文本以减少 keyword 选项的数量,直到搜索结果包含足够短的 keywords 列表,用户可以从中选择要搜索的单词用于他们的搜索。
问题是底层数据表中有 80,000 个keywords,我的应用程序需要 20 分钟才能将所有这些 keywords 发送到 JSP,即使我在底层上放置了索引用于搜索的字段的数据库表。有没有什么方法可以设置成keywords 仅在搜索框中输入至少 3 个字符的文本时才发送到 JSP?
这是我的controller 方法:
@RequestMapping(value = "/search", method = RequestMethod.GET)
public String processFindForm(
ConcWordKey wordkey, HttpServletRequest request, BindingResult result, Map<String, Object> model) {
Collection<ConcWordKey> results = this.clinicService.findKeyWord("");
System.out.println("results.size() is: "+results.size());
model.put("selections", results);
return "search";
}
这里是 JSP 的相关部分:
<datatables:table id="keywords" data="${selections}" cdn="true" row="kw" theme="bootstrap2"
cssClass="table table-striped" paginate="true" info="false"
cssStyle="width: 150px;" align="left" dom="frtp">
<datatables:column title="Name" cssStyle="width: 150px;" display="html">
<spring:url value="/search?name={name}" var="searchUrl">
<spring:param name="name" value="${kw.name}"/>
</spring:url>
<a href="${fn:escapeXml(searchUrl)}"><c:out value="${kw.name}"/></a>
</datatables:column>
</datatables:table>
这是填充选择的 JPA 方法:
@SuppressWarnings("unchecked")
public Collection<ConcWordKey> findKeyWord(String str) {
Query query = this.em.createQuery("SELECT DISTINCT wk FROM ConcWordKey wk WHERE wk.name LIKE :wd");
query.setParameter("wd", str + "%");
Collection<ConcWordKey> results = query.getResultList();
return results;
}
【问题讨论】:
-
引入分页并限制每页数据。
-
@LeosLiterak 谢谢。但是你能告诉我它在代码中的样子吗?
-
@CodeMed 我可以暂时建议一种解决方法,直到我通过蒲公英数据表 API。如果大小小于 3,则在您的控制器中不要总是调用您的 DAO 方法。当输入的关键字长度至少为 3 时,调用数据库以获取结果。同时我为此搜索 altimate 解决方案
-
@Gautam 非常感谢。但我什至不知道如何写超过 3 个字符的检查。
-
就像你的代码 Collection
results = this.clinicService.findKeyWord(inputString);在 inputString 大小小于 3 之前不要执行此行
标签: java spring jsp spring-mvc jpa