Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/xamarin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql JPA条件查询以查找每个唯一名称的最大ID_Sql_Jpa_Jpa 2.0_Criteria Api - Fatal编程技术网

Sql JPA条件查询以查找每个唯一名称的最大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

编辑:显然我之前的问题是不够的,所以我会在这次尝试中把它弄清楚

我在表中有一组行,由谓词p1选择,在id列中每个行都有一个唯一的值。路径名列可能有多个相同值的实例。我们想要的是只返回具有具有最高值id的独特路径名的实体

 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)
假设现有根Root、CriteriaQuery、CriteriaBuilder和CriteriaBuilder,则可以编写JPA标准:

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)
假设现有根Root、CriteriaQuery、CriteriaBuilder和CriteriaBuilder,则可以编写JPA标准:

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的标准吗?不