我有一个书籍搜索页面。我可以按标题或类别进行搜索(在我的模型中,一本书与一个独特的类别相关联)。当我显示结果时,我也想显示类别名称。这是我做的:
<liferay-ui:search-container-results>
<%
searchContainer.setTotal(BookLocalServiceUtil.searchBooksCount(title, categoryId));
searchContainer.setResults(BookLocalServiceUtil.searchBooks(title, categoryId));
%>
</liferay-ui:search-container-results>
<liferay-ui:search-container-row
className="example.Book"
keyProperty="bookId"
modelVar="book" escapedModel="<%= true %>"
>
<portlet:renderURL var="editURL">
<portlet:param name="mvcPath" value="/html/book/edit_book.jsp" />
<portlet:param name="bookId" value="<%= String.valueOf(book.getBookId()) %>" />
</portlet:renderURL>
<liferay-ui:search-container-column-text
name="Book"
value="<%= String.valueOf(book.getTitle()) %>"
href="<%= editURL %>"
/>
<liferay-ui:search-container-column-text
name="Category"
value="<%= CategoryLocalServiceUtil.getCategory(book.getCategoryId()).getName() %>"
/>
</liferay-ui:search-container-row>
这根本没有优化。最好的方法是使用连接编写自定义SQL,但我不能,因为我的查询中有可选参数(书名和类别)。 有什么想法吗?
编辑这是我当前的查询:
public List<book> searchBooks(String title, Long categoryId)
throws SystemException {
DynamicQuery dynamicQuery = DynamicQueryFactoryUtil.forClass(Book.class);
if (Validator.isNotNull(title)) {
dynamicQuery.add(PropertyFactoryUtil.forName("title").eq(title));
}
if (Validator.isNotNull(categoryId)) {
dynamicQuery.add(PropertyFactoryUtil.forName("categoryId").eq(categoryId));
}
List<Book> lst = BookLocalServiceUtil.dynamicQuery(dynamicQuery);
return lst;
}
答案 0 :(得分:0)
处理可选参数的最简单方法是将null视为非过滤值。
由于您没有说出哪个RDBMS正在使用我正在使用T-SQL语法显示谓词示例:
WHERE (@Title = Book.Title -- filtering
OR @Title IS NULL) -- not filtering f the parameter is null
AND ( -- chain expressions like the expression above
请注意,这不是最佳选择。如果你有性能问题,它与severs tretat这个查询的方式有关:他们通常不够聪明,没有意识到,如果参数为null,他们不需要评估OR表达式的第一部分< / em>的