我们说我们有一个实体" 设备"它包含其他实体" DeviceInfo ",我们有一个实体" 网站"其中包含" DeviceInfo "的列表实体和" DeviceInfo "有一个" 设备"和" 网站"在它的属性。
我的任务是找到一个" 网站"中的所有" 设备"对于某个端点,我会发送一个" 网站" id和页码和页面大小(因为它必须是可分页的)。我通过创建JPA规范
使其工作public static Specification<Device> bySearchRequest(final DeviceSearchRequest searchRequest) {
return (root, query, cb) -> {
final Join<Device, DeviceInfo> deviceInfo
= root.join(Device_.deviceInfo, JoinType.LEFT);
final Join<DeviceInfo, Site> site
= deviceInfo.join(DeviceInfo_.site, JoinType.LEFT);
return cb.and(cb.equal(site.get(Site.id), searchRequest.getSiteId()));
};
}
然后使用我会将&#34; 设备&#34;转换为ES中的&#34; IndexDevice &#34; s。
deviceRepository.findAll(currentUser,
DeviceRepository.Specs.bySearchRequest(searchRequest),
new PageRequest(searchRequest.getPage(), searchRequest.getSize()))
.getContent().stream().map(x ->indexedDeviceConverter.convert(x)).collect(Collectors.toList());
就是这样。有用。但是我在这里从数据库获取数据,我已经在Elasticsearch中拥有了所有内容。有没有办法让同样的查询直接从ES获取数据( with paging )?
唯一区别在于ES&#34; IndexedDevice &#34;与&#34; IndexedSite &#34;有直接关系。 (没有&#34; IndexedDeviceInfo &#34;)。
IndexedDevice
{
"id":"3eba5104-0c7a-4564-8270-062945cc8f5e",
"name":"D4",
"site":{
"id":"46e7ada4-3f34-4962-b849-fac59c8fe8ad",
"name":"SomeSite",
"displayInformation":"SomeSite",
"subtitle":""
},
"suggest":{
"input":[]
},
"displayInformation":"D4",
"subtitle":""
}
IndexedSite
{
"id": "46e7ada4-3f34-4962-b849-fac59c8fe8ad",
"name": "SomeSite",
"displayInformation": "SomeSite",
"subtitle": ""
}
答案 0 :(得分:0)
我设法做到了。最后它非常简单。我使用了ElasticsearchRepository(org.springframework.data.elasticsearch.repository)。
elasticsearchRepositoy.search(QueryBuilders.termsQuery
("site.id",
searchRequest.getSite()),
new PageRequest(searchRequest.getPage(),
searchRequest.getSize()));