【问题标题】:Filter predicate count with Spring Data使用 Spring Data 过滤谓词计数
【发布时间】:2015-01-16 02:34:54
【问题描述】:

我正在构建一个带有 Spring Data Backend 的 Java Spring MVC webapp。在我的应用程序中,您可以搜索文章或类别。稍后,您可以使用颜色、大小等进一步过滤谓词来细化搜索结果。我想知道如何像 autoscout24.com 那样将总数添加到每个谓词中。

示例:

搜索过的文章:运动鞋
搜索类别:鞋子

优化您的搜索:

颜色:
红色 (1.001)
绿色 (453)
黑色 (12.000)

尺寸:
8 (1.000)
9 (2.000)
10 (10.021)

这意味着有 1000 款 8 号运动鞋可供选择。如果我选择红色,8 号鞋的总数也会减少,因为并非所有 8 号鞋都是红色的。 我在查询中使用 Pageable 是因为我不想一次从数据库中加载数千篇文章。这意味着无法在结果列表中进行计数。它也无法扩展。或者这是通过使用具有多个计数的第二个查询来完成的?我如何将它与 Spring Data 一起使用?有可能还是我必须使用本机查询?

谢谢, 尼克

【问题讨论】:

    标签: java sql spring-data


    【解决方案1】:

    您应该构建一个自定义查询并使用SELECT colorName, count(*) FROM myTable GROUP BY colorName

    另一种方法是对每个属性使用count(*) 查询,即

    SELECT count(*) FROM myTable WHERE colorName = 'red';
    SELECT count(*) FROM myTable WHERE colorName = 'green';
    SELECT count(*) FROM myTable WHERE colorName = 'black';
    

    尺寸相同。但这可能比GROUP BY 慢。


    替代方案(更快,但更复杂):

    创建一个额外的表,作为某种键值存储,您可以在其中保存预先计算的值:

    type | name | amount
    --------------------
    COLOR| red  | 1001
    COLOR| green| 453
    COLOR| black| 12000
    SIZE | 8    | 1000
    SIZE | 9    | 2000
    SIZE | 10   | 10021
    

    每当创建/更新/删除项目时,您还必须使用预先计算的值更新表。

    您还可以存储更复杂的内容,例如“'color=green' & 'size=9' 的组合数量”。它总是一个简单的amount = amount+1amount = amount-1

    这种方式检索值非常快,但您必须维护一个额外的表。


    我知道,这个答案与 Spring Data 并没有真正的关系,但在这种情况下,Spring Data 并不能为您做很多事情。您期望的逻辑必须是手工制作的,Spring Data 只能为您执行查询并将结果映射到一些 POJO。

    【讨论】:

    • 谢谢,我想我会试试第二部分。因为无论如何我都是通过批量导入 csv 文件来填充我的数据库,所以我也可以填充这个新的金额表。我认为如果在导入期间存储过滤谓词的组合会很聪明。例如。如果有尺寸为 8 的红色文章并且还没有其他文章,我会将“COLOR&SIZE”与“red&8”和数量 = 1 的组合插入到数据表中,如果已经有一个条目,我将增加数量。好的!谢谢。
    • 如果你插入“red & 8”,那么你应该做red++8++red&8++,因为文章属于所有三个类别。还要确保指定属性的具体排序(可能只是按类别名称的字母顺序),因为如果用户搜索color=red + size=8price=300,您必须知道您正在寻找@987654334 @(因为 color price size)而不是 300&8&red。此外,您可能还需要考虑多值属性 - 即,如果一篇文章可以有多种颜色,等等。请问您是否需要更多信息。
    • 嘿,谢谢!如果有更多问题,我会问你!
    猜你喜欢
    • 2015-01-21
    • 1970-01-01
    • 2016-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多