我正在使用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中使用它?是否可以或我必须使用本机查询?
谢谢, 尼克
答案 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+1
或amount = amount-1
。
这样检索值非常快,但你必须维护一个额外的表。
我知道,这个答案与Spring Data并不真正相关,但在这种情况下,Spring Data并没有真正为你做的事情。您期望的逻辑必须是手工制作的,Spring Data只能为您执行查询并将结果映射到某个POJO。