因此,我最终使用的解决方案是创建两个@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可以在启动时(而不是在调用查询时)进行验证。
通过在两个查询之间进行一致的命名,可以仅基于查询的基本名称来包装代码主体以运行两个集合。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)