有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

带有Spring数据的java筛选器谓词计数

我正在使用Spring数据后端构建一个JavaSpringMVCwebapp。在我的应用程序中,您可以搜索文章或类别。稍后,您可以使用进一步的过滤谓词(如颜色、大小等)优化搜索结果。我想知道如何将total添加到每个谓词中,比如autoscout24。是的

示例:

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

优化搜索:

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

大小:
8(1.000)
9(2.000)
10(10.021)

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

谢谢, 尼克


共 (1) 个答案

  1. # 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
    

    创建/更新/删除项时,还必须使用预计算的值更新表

    您还可以存储更复杂的内容,如“组合量‘颜色=绿色’”和‘大小=9’”。它总是一个简单的amount = amount+1amount = amount-1

    这样,检索值的速度非常快,但您必须维护一个额外的表


    我知道,这个答案实际上与Spring数据无关,但在这种情况下,Spring数据并不能为您提供多少帮助。您期望的逻辑必须是手工编制的,Spring数据只能为您执行查询并将结果映射到某些POJO