在搜索容器中加入显示查询的最佳方法

时间:2014-10-24 07:20:45

标签: sql join liferay

我有一个书籍搜索页面。我可以按标题或类别进行搜索(在我的模型中,一本书与一个独特的类别相关联)。当我显示结果时,我也想显示类别名称。这是我做的:

    <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;     
}

1 个答案:

答案 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>的