我有一个基于“项目”的视图,其中一个项目属于一个容器,一个容器由几个项目组成。此外,一个项目有一个位置,几个项目可以有相同的位置。
数据库视图:
id_item id_container id_location container_name container_code amount
'I1' 'C1' 'L1' 'container #01' 'c01' 10
'I2' 'C1' 'L1' 'container #01' 'c01' 5
'I3' 'C1' 'L2' 'container #01' 'c01' 25
'I4' 'C2' 'L3' 'container #02' 'c02' 30
我想选择按容器分组:
按容器分组实体:
@Entity
public class GroupByContainerEntity {
private String idContainer;
private String containerName;
private String containerCode;
private List<String> locations; // OR private String locations; -> comma separated ids
private Integer sumAmount;
private Integer countItems;
}
存储库:
public interface IGroupByContainerRepository extends JpaRepository<GroupByContainerEntity, String>, JpaSpecificationExecutor<GroupByContainerEntity> {
}
我需要传递额外的规范(例如,仅某些位置和容器)和分页(例如,按容器名称排序),因此,(本机)查询方法不起作用:
groupByContainerRepository.findAll(Specification, Pageable)
是否有任何方法可以加载按容器分组的数据(通过spring数据库)?规范和分页支持是强制性的。
4条答案
按热度按时间lg40wkob1#
尽管
Specification
类设计用于处理where子句,但在Specification
类中指定group by子句也可以工作。要避免
Specification::toPredicate
方法必须返回Predicate
示例的问题,可以创建一个Specification
类,其中的where子句等于1=1
,同时在该方法中声明group by子句,就像下面的示例一样:其它附加规格(如库位和集装箱代码)可以单独指定:
第一个
通过这样做,您可以重用
groupByContainerRepository.findAll(Specification, Pageable)
来满足您的需求。值得一提的是,实体类
GroupByContainerEntity
中包含了locations、sumAmount、countItems等聚合字段,为了处理这些字段,我们可以用@Formula
来标注这些字段,并提供查询,因此需要对GroupByContainerEntity
类做进一步修改,如下所示:我也把上面的代码推到了gitlab。这个项目使用SQLite作为数据库,所以你可以克隆一下。
x0fgdtte2#
我喜欢更实用的方法:
然后,您可以执行以下操作:
函数接口可以通过util类中的所有类型的“equals,like,notEquals”进行扩展。
7vux5j2d3#
1.尝试条件生成器查询:
(标准生成器平均值(空));(使用您分组依据函数)cList=会话工厂.openSession().创建查询(cq_按容器实体分组).getResultList();
nnvyjq4y4#