使用Spring Data过滤谓词计数

时间:2014-11-18 19:18:09

标签: java sql spring-data

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

实施例:

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

优化您的搜索:

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

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

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

谢谢, 尼克

1 个答案:

答案 0 :(得分:2)

您应该构建自定义查询并使用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。