我喜欢 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 以保持值一致,这似乎不太理想。
这里的一个常见用例是获取项目的一些子集,但需要某种方式来指示总计数(“显示 400 的 1-10”)。