作者热门文章
- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我喜欢 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,共 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,您可以在启动时而不是在调用查询时进行验证。
通过在两个查询之间进行一致的命名,可以包装代码主体以仅通过基于查询的基本名称来运行这两个集合。
关于java - 有没有办法获取带有结果集的 JPA 命名查询的计数大小?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2285270/
我是一名优秀的程序员,十分优秀!