Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/312.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/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
Java 将现有JPAQuery用作子查询_Java_Jpa_Jpql_Querydsl - Fatal编程技术网

Java 将现有JPAQuery用作子查询

Java 将现有JPAQuery用作子查询,java,jpa,jpql,querydsl,Java,Jpa,Jpql,Querydsl,我有一个JPAQuery的实例,需要检索计数。但是,由于该表可能包含许多项(百万),因此我希望将计数限制在给定的最大值,例如50000 当前的QueryDSL代码有效地执行以下操作: query.fetchCount(); 现在,我想要的修改在原始sql中非常简单: select count(*) from (<whatever query> limit 50000); 我正在使用querydsl 4。JPAExpressions.select(Wildcard.all)返回Si

我有一个
JPAQuery
的实例,需要检索计数。但是,由于该表可能包含许多项(百万),因此我希望将计数限制在给定的最大值,例如50000

当前的QueryDSL代码有效地执行以下操作:

query.fetchCount();
现在,我想要的修改在原始sql中非常简单:

select count(*) from (<whatever query> limit 50000);

我正在使用querydsl 4。

JPAExpressions.select(Wildcard.all)返回SimplyQuery的子级,您可以对其调用limit

JPAExpressions.select(Wildcard.all)
    .from(entity)
    .limit(50000)
    .fetchCount();

JPAExpressions.select(Wildcard.all)
返回SimplyQuery的子级,您可以对其调用limit

JPAExpressions.select(Wildcard.all)
    .from(entity)
    .limit(50000)
    .fetchCount();

为什么要限制计数查询<代码>计数(*)无论如何都非常快。目前,您可以像
JPAExpressions.select(Wildcard.all).from(entity.fetchCount().limit(50000)
(代码可能是错误的)一样进行操作。不幸的是,如果它所依赖的查询没有正确的索引(例如,我认为不是唯一的),那么
count(*)
的速度会很慢。在我的情况下,它不会无限扩展。。。我认为你在这里有点错了。在不到一秒钟的时间里,我对大约400万个条目进行了计数,该表肯定没有索引whatsoeverth这很好,但不幸的是,我还有其他情况。我在oracle 12.1数据库上执行了一次计数,该数据库的过滤器与索引完全匹配,这需要几分钟的时间。如果可能匹配的子集非常大和/或统计数据关闭,oracle optimizer有时似乎会执行完整表扫描或其他异常缓慢的操作。为什么还要限制计数查询<代码>计数(*)无论如何都非常快。目前,您可以像
JPAExpressions.select(Wildcard.all).from(entity.fetchCount().limit(50000)
(代码可能是错误的)一样进行操作。不幸的是,如果它所依赖的查询没有正确的索引(例如,我认为不是唯一的),那么
count(*)
的速度会很慢。在我的情况下,它不会无限扩展。。。我认为你在这里有点错了。在不到一秒钟的时间里,我对大约400万个条目进行了计数,该表肯定没有索引whatsoeverth这很好,但不幸的是,我还有其他情况。我在oracle 12.1数据库上执行了一次计数,该数据库的过滤器与索引完全匹配,这需要几分钟的时间。如果潜在的匹配子集非常大和/或统计数据关闭,oracle optimizer有时似乎会执行完整表扫描或其他异常缓慢的操作。我不理解。在您的示例中,
query
在哪里起作用?
JPAExpressions.select(Wildcard.all)
是一个查询。查看文档以了解其工作原理。您仍然可以从(…)调用
。我只是没有把它包括进去。@Felk你不应该需要那个查询。我怀疑您能否从查询中创建单独的查询。最多可以复制查询并计算第二个查询<代码>JPAExpressions.select(通配符.all).from(实体).limit(50000).fetchCount()
很可能是您所需要的(可能添加where子句)。不幸的是,我没有访问底层实体的权限,只有查询本身,您的示例不会限制计数后的结果集吗?Measing它统计所有实体,然后将结果(始终为1行:计数)限制为50000,我不明白。在您的示例中,
query
在哪里起作用?
JPAExpressions.select(Wildcard.all)
是一个查询。查看文档以了解其工作原理。您仍然可以从(…)调用
。我只是没有把它包括进去。@Felk你不应该需要那个查询。我怀疑您能否从查询中创建单独的查询。最多可以复制查询并计算第二个查询<代码>JPAExpressions.select(通配符.all).from(实体).limit(50000).fetchCount()
很可能是您所需要的(可能添加where子句)。不幸的是,我没有访问底层实体的权限,只有查询本身,您的示例不会限制计数后的结果集吗?Measing对所有实体进行计数,然后将结果(始终为1行:计数)限制为50000