假设我们有一个实体“设备”--它包含其他实体"DeviceInfo",我们有一个实体"Site“,其中包含"DeviceInfo”实体的列表,而“DeviceInfoE 29在其属性中有”E 110设备E 211和“E 112站点E 213”。
我的任务是找到“Device”中的所有"Site“。我会向某个端点发送一个"Site“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()));
};
} 然后使用我将“Device”转换为ES中的设备。
deviceRepository.findAll(currentUser,
DeviceRepository.Specs.bySearchRequest(searchRequest),
new PageRequest(searchRequest.getPage(), searchRequest.getSize()))
.getContent().stream().map(x ->indexedDeviceConverter.convert(x)).collect(Collectors.toList());就是这样。它起作用了。但是在这里,我从DB中获取数据,我已经在Elasticsearch中获得了所有内容。是否有一种方法可以使同样的查询直接从ES (带有分页的)获取数据?
唯一的区别是,在ES中,"IndexedDevice“与"IndexedSite”有直接关系(没有"IndexedDeviceInfo"). )。
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": ""
}发布于 2017-03-17 10:14:43
我成功做到了。最后真的很简单。我用的是(org.springframework.data.elasticsearch.repository). ElasticsearchRepository
elasticsearchRepositoy.search(QueryBuilders.termsQuery
("site.id",
searchRequest.getSite()),
new PageRequest(searchRequest.getPage(),
searchRequest.getSize()));https://stackoverflow.com/questions/42850873
复制相似问题