动态Querydsl过滤器谓词取决于搜索结果

时间:2014-12-11 08:57:17

标签: java sql spring spring-data querydsl

我使用Spring MVC和Spring Data开发了产品搜索。用户可以按名称/描述搜索产品(手动输入。搜索产品#名称和产品#描述"类似")或按类别(可点击链接)。当显示结果时,用户应该能够通过一些过滤器谓词(如价格,大小,颜色等)进一步缩小结果范围。因此我实施了一些Querydsl谓词。

让我们说用户找到了红色,绿色和黄色的产品,然后我想在我的过滤器中仅显示这些颜色。我不想使用静态值并提供您可以想象的所有颜色。

我不能遍历整个结果并将所有可用颜色放在列表中,因为我正在使用Paging,因此我不会在堆中有整个结果集来迭代。

我是否必须对结果集上的每个过滤谓词执行额外的SQL查询?我想到了一个带有预先计算结果的附加表。好吧,我可以用它来进行类别搜索。但是,由于用户可以在产品#名称和产品#说明上进行手动输入搜索,因此我无法预测每个可能的搜索字符串......

产品每天都在变化,因为我每晚都会进行多次Spring Batch CSV导入(更新,删除和添加产品)。

任何的想法?

谢谢你尼克

1 个答案:

答案 0 :(得分:1)

解决了它。使用包含搜索字符串或类别的谓词创建自定义查询。如果设置了过滤器属性,我将其作为内部联接添加到查询中。在过滤器中,我为每个包含有效值的属性都有一个List。 E.g。

...
query.from(product).where(predicate);    
if(isColorFilterSet()) {    
    JPAQuery colorQuery = query.from(color).innerJoin(product.colors, color)
                  .groupBy(color);
    List<Color> colors = colorQuery.list(color);
    filter.setFilterableBaseColors(colors);
}