当前位置: 首页 > 面试题库 >

有没有一种方法可以获取带有结果集的JPA命名查询的计数大小?

吴修洁
2023-03-14
问题内容

我喜欢JPA中针对静态查询的命名查询的想法,但是我经常想获取查询的计数结果以及查询的某些子集的结果列表。我不想写两个几乎相同的NamedQueries。理想情况下,我想要的东西是这样的:

@NamedQuery(name = "getAccounts", query = "SELECT a FROM Account")
.
.
  Query q = em.createNamedQuery("getAccounts");
  List r = q.setFirstResult(s).setMaxResults(m).getResultList();
  int count = q.getCount();

假设m为10,s为0,并且Account中有400行。我希望r中有10个项目的列表,但我想知道总共有400行。我可以写第二个@NamedQuery:

@NamedQuery(name = "getAccountCount", query = "SELECT COUNT(a) FROM Account")

但是如果我总是只想要计数,那么这样做似乎违反了DRY。在这种简单的情况下,很容易使两者保持同步,但是如果查询发生更改,则必须同时更新两个@NamedQueries以使值保持一致似乎不太理想。

这里的一个常见用例是获取项目的某些子集,但需要某种方式来指示总数(“显示1-10 of 400”)。


问题答案:

因此,我最终使用的解决方案是创建两个@NamedQuerys,一个用于结果集,一个用于计数,但是使用静态字符串捕获基本查询以维护DRY并确保两个查询保持一致。因此,对于上面的内容,我会有类似以下内容:

@NamedQuery(name = "getAccounts", query = "SELECT a" + accountQuery)
@NamedQuery(name = "getAccounts.count", query = "SELECT COUNT(a)" + accountQuery)
.
static final String accountQuery = " FROM Account";
.
  Query q = em.createNamedQuery("getAccounts");
  List r = q.setFirstResult(s).setMaxResults(m).getResultList();
  int count = ((Long)em.createNamedQuery("getAccounts.count").getSingleResult()).intValue();

显然,在此示例中,查询主体是微不足道的,这是过分的。但是对于更复杂的查询,您最终只能对查询主体进行定义,并且可以确保两个查询保持同步。您还可以获得查询被预编译的优势,并且至少使用Eclipselink可以在启动时(而不是在调用查询时)进行验证。

通过在两个查询之间进行一致的命名,可以仅基于查询的基本名称来包装代码主体以运行两个集合。



 类似资料:
  • 问题内容: 我正在编写小型且非常干燥的框架,该框架高度依赖元数据。我想知道是否有一种方法来获取方法参数名称,即给定一些方法 得到的字符串和。 我知道我可以注释参数,但是那不是很好。 问题答案: 我们为包含参数名称的String[]的方法创建了一个自定义注释。与必须注释每个单独的参数相比,此方法感觉易于管理。我们计划添加构建时检查,以确保带注释的参数名称的数量与参数的数量匹配,因为这是我们所需要的。

  • 我希望执行一个(Postgre)SQL本机查询,它既不是“选择”查询,也不是“更新”查询,也不是“删除”查询。它是“刷新物化视图名称”据我所知没有结果。 使用JPA/JPQL执行此类查询的正确方法是什么? 似乎需要结果集或更新/删除计数。

  • 我正在使用Jersey创建一个RESTful API,其中实现了一个ExceptionMapper类来捕获所有错误。 有没有办法从异常中获取查询字符串?或者实现PreparedStatement并在其中创建一个方法来获取查询字符串?

  • 简而言之:有没有一种方法可以在gcc或CLANG中不推荐命名空间? 长: 现在我想知道是否有更好的方法来做类似的事情,比如将名称空间util的使用标记为不推荐使用。 我们使用GCC4.7.3作为生产编译器,但是针对clang进行构建和测试,以尝试捕捉gcc的细节;因此,在这些编译器上工作的东西会有所帮助。

  • 我试图让我的UI显示两个按钮,其中一个稍微重叠在另一个,在一个全幅卡的中间。因为堆栈的宽度只能与其未定位的子级相同,所以我添加了一个宽度为double.infinity的SizedBox的未定位子级,以便给我一个画布来放置按钮,但我不知道该放什么作为SizedBox的高度。理想情况下,无论用户是在手机上还是在平板电脑上,我都希望这个小部件能够适当地调整自己的大小,所以我宁愿将SizedBox的高度

  • 问题内容: 我需要在Sql Server 2005中进行选择查询的解决方案。 我想查询返回两个结果集,每个结果集恰好包含符合特定条件的所有记录的一半。我尝试将TOP 50 PERCENT与Order By一起使用,但是如果表中的记录数为奇数,则两个结果集中都会显示一条记录。我不想在记录集上重复任何记录。例子: 我有一个简单的表,其中包含TheID(PK)和TheValue字段(varchar(10