如何在querydsl和spring Boot jpa中编写一个带有group by的查询,返回记录的最新版本?

fkvaft9z  于 2022-12-13  发布在  Spring
关注(0)|答案(1)|浏览(170)

我和我的团队已经在这个问题上纠缠了几个星期了,我们不知道我们遗漏了什么。我们正在使用angular和spring Boot 、java hib和sql数据库。目前我们从一个连接到爬虫的数据库中获取数据。另一个数据库已经准备好了,用于我们的应用程序数据。
现在......我们有了一个表,该表应该只显示Crawler数据库中最新的条目。一个条目看起来如下所示:

id | type | number | version | ...
 
12   1      200      2015

类型和编号指示它所涉及的记录。这意味着可能存在另一个编号200,类型为1,但版本为2021
目前,我们通过以下查询获取每种类型的所有记录:

// code
QRecord standard = QRecord.record;
BooleanBuilder query = new BooleanBuilder();

query.and(record.type.eq(type));
// code

我们还尝试使用queryFactory:

// code
queryFactory.selectFrom(record).where((record.type(type).collect(Collectors.toList()))
JPAExpressions.select(record.version.max()).from(record)))).fetch()
// code

或者把这两个人混在一起,比较一下最后的名单:

BooleanBuilder typeQuery = new BooleanBuilder();
typeQuery.and(record.type.eq(type).collect(Collectors.toList()))

List<Record> typeRecords = recordRepository.findAll(query, p).stream().map(x -> RecordMapper.mapRecord(x)).collect(Collectors.toList())

List<Record> newestRecords = queryFactory.selectFrom(record)
                         .where(record.version.eq(JPAExpressions.select(record.version.max())
                         .from(record))).fetch().stream().map(x -> RecordMapper.mapRecord(x))
                         .collect(Collectors.toList()));

我们认为我们可能需要一个group by,但我们在这方面没有取得任何进展。我们找不到一个解决方案,我们没有重复的数据,只有最新的版本。请帮助。
我可以提供更多的信息和代码,如果需要的话。

oaxa6hgo

oaxa6hgo1#

您希望消除所有存在更高版本号的ID:

SELECT a
LEFT JOIN b.id ON a.id = b.id and a.version < b.version
WHERE b.id IS NULL

相关问题