java - Dynamic Querydsl 根据搜索结果过滤谓词

标签 java sql spring spring-data querydsl

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

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

我无法遍历整个结果并将所有可用颜色放入列表中,因为我正在使用分页,所以我没有在堆中设置整个结果来遍历。

我是否必须为结果集上的每个过滤谓词执行额外的 sql 查询?我想到了一个带有预先计算结果的附加表。好吧,我可以将其用于类别搜索。但是由于用户也可以在 product#name 和 product#description 上进行手动输入搜索,我无法预测每个可能的搜索字符串......

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

任何想法?

谢谢
尼克

最佳答案

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

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

关于java - Dynamic Querydsl 根据搜索结果过滤谓词,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27418822/

相关文章:

java - JFileChooser 扩展

sql - 在多行中中断 PL/SQL 过程调用的正确语法是什么?

mysql - 如果它的某些值是空的,如何按列排序查询?

Spring Cron Expression 每周二晚上 9 点运行?

java - 捕获测试中的日志

java - 不显示表达式语言的值

java - 重新分配作业 : "Could not create the Java virtual machine."

php - 无法弄清楚我的 SQL 语法有什么问题

java - 多个项目中的实体

java - Android - Glide 库内存不足异常