Sql JPA条件查询以查找每个唯一名称的最大ID
编辑:显然我之前的问题是不够的,所以我会在这次尝试中把它弄清楚 我在表中有一组行,由谓词p1选择,在id列中每个行都有一个唯一的值。路径名列可能有多个相同值的实例。我们想要的是只返回具有具有最高值id的独特路径名的实体Sql JPA条件查询以查找每个唯一名称的最大ID,sql,jpa,jpa-2.0,criteria-api,Sql,Jpa,Jpa 2.0,Criteria Api,编辑:显然我之前的问题是不够的,所以我会在这次尝试中把它弄清楚 我在表中有一组行,由谓词p1选择,在id列中每个行都有一个唯一的值。路径名列可能有多个相同值的实例。我们想要的是只返回具有具有最高值id的独特路径名的实体 CriteriaBuilder builder = em.getCriteriaBuilder(); CriteriaQuery<TextDocument> query = builder.createQuery(TextDocument.class); Roo
CriteriaBuilder builder = em.getCriteriaBuilder();
CriteriaQuery<TextDocument> query = builder.createQuery(TextDocument.class);
Root<TextDocument> root = query.from(TextDocument.class);
// descending ids, and group similar names together
query.orderBy(builder.desc(root.get(TextDocument_.id)));
query.groupBy(root.get(TextDocument_.pathName));
// filter
Predicate p1 = builder.equal(root.get(TextDocument_.parent), rootdoc);
Predicate p2 = builder.equal(root.get(TextDocument_.id), builder.max(root.get(TextDocument_.id)));
query.where(p1, p2);
正确的结果(对于parent=22)是:
id parent pathName
--- ------- ---------
250 22 charlie
339 22 beta
400 22 alpha
401 22 delta
有人能帮我完成这个查询吗?你可以这样做
SELECT * from [tableName] t1
WHERE not exists(SELECT * from [tableName]t2 where t1.name = t2.name and t2.id > t1.id)
你可以这样做
SELECT * from [tableName] t1
WHERE not exists(SELECT * from [tableName]t2 where t1.name = t2.name and t2.id > t1.id)
使用sql的Reza示例:
SELECT * from [tableName] t1
WHERE not exists(SELECT * from [tableName]t2 where t1.name = t2.name and t2.id > t1.id)
假设现有根Subquery<TableEntity> subQuery = criteriaQuery.subquery(TableEntity.class);
Root<TableEntity> subQueryRoot = subQuery.from(TableEntity.class);
subQuery.select(subQueryRoot)
.where(criteriaBuilder.and(
criteriaBuilder.equal(subQueryRoot.get(TableEntity_.name), root.get(TableEntity_.name)),
criteriaBuilder.greaterThan(subQueryRoot.get(TableEntity_.id), root.get(TableEntity_.id))
));
predicates.add(criteriaBuilder.not(criteriaBuilder.exists(subQuery)));
Subquery Subquery=criteriaQuery.Subquery(TableEntity.class);
Root subQueryRoot=subQuery.from(TableEntity.class);
subQuery.select(subQueryRoot)
.where(标准生成器)和(
criteriaBuilder.equal(subQueryRoot.get(TableEntity_U2;.name),root.get(TableEntity_U2;.name)),
greaterThan(subQueryRoot.get(TableEntity.id),root.get(TableEntity.id))
));
add(criteriaBuilder.not(criteriaBuilder.exists(子查询));
使用sql的Reza示例:
SELECT * from [tableName] t1
WHERE not exists(SELECT * from [tableName]t2 where t1.name = t2.name and t2.id > t1.id)
假设现有根Subquery<TableEntity> subQuery = criteriaQuery.subquery(TableEntity.class);
Root<TableEntity> subQueryRoot = subQuery.from(TableEntity.class);
subQuery.select(subQueryRoot)
.where(criteriaBuilder.and(
criteriaBuilder.equal(subQueryRoot.get(TableEntity_.name), root.get(TableEntity_.name)),
criteriaBuilder.greaterThan(subQueryRoot.get(TableEntity_.id), root.get(TableEntity_.id))
));
predicates.add(criteriaBuilder.not(criteriaBuilder.exists(subQuery)));
Subquery Subquery=criteriaQuery.Subquery(TableEntity.class);
Root subQueryRoot=subQuery.from(TableEntity.class);
subQuery.select(subQueryRoot)
.where(标准生成器)和(
criteriaBuilder.equal(subQueryRoot.get(TableEntity_U2;.name),root.get(TableEntity_U2;.name)),
greaterThan(subQueryRoot.get(TableEntity.id),root.get(TableEntity.id))
));
add(criteriaBuilder.not(criteriaBuilder.exists(子查询));
您尝试过什么?SQL的哪一部分不能复制?JPQL和JPA标准要求实体而不是表,并且您尚未发布it@BillyFrost我用代码重申了这个问题,你现在觉得它更有意义吗?你找到解决方案了吗?@Anchikagarwal我不记得我们是否在JPA中解决了这个问题。最终我们将该项目转换为Elasticsearch,所以这个问题没有实际意义。您尝试过什么?SQL的哪一部分不能复制?JPQL和JPA标准要求实体而不是表,并且您尚未发布it@BillyFrost我用代码重申了这个问题,你现在觉得它更有意义吗?你找到解决方案了吗?@Anchikagarwal我不记得我们是否在JPA中解决了这个问题。最终,我们将该项目转换为Elasticsearch,所以这个问题没有意义。。。这是JPA的标准吗?没有这个问题问的是JPA的标准。。。这是JPA的标准吗?不