在没有得到结果的情况下计入jpa

时间:2014-06-10 15:05:45

标签: jpa count criteria named-query

我正在尝试在db中提供所有我的其余服务响应(分页(部分)结果),其中记录数,即1..5 / 150,我正在使用OpenJpa 2.3.0 我以两种方式获取记录,执行 namedQueries ,或使用 CriteriaBuilder 构建查询。

使用criteriaBuilder,我正在为Long.class创建新的criteriaQuery,然后我为this和原始(获取记录的那个)提供谓词查询

public static CriteriaQuery<Long> createCountCriteria(CriteriaBuilder cb, Class forType) {
    CriteriaQuery<Long> countQuery = cb.createQuery(Long.class);
    countQuery.select(cb.countDistinct(countQuery.from(forType)));
    return countQuery;
}

工作得很好。对于命名查询,我尝试替换部分查询并将其作为nativeQuery

执行
public static Query createCountQuery(EntityManager entityManager, Query query) {

    String queryStr = query.toString();
    int indexOfFromClause = queryStr.indexOf("FROM");

    if (!queryStr.isEmpty() && indexOfFromClause > -1) {
        return entityManager.createNativeQuery("SELECT count(1) " + queryStr.substring(indexOfFromClause));
    }

    throw new IllegalArgumentException("Query parameter is empty or invalid (no FROM clause found).");
}

仅在没有where子句时才有效,因为在where子句中使用了JPQL,而不是真正的db列名,因此在执行时,带有Unknown列的异常会升起

你能否告诉我任何通用的方法,而不需要为每个命名查询提供xyzCount namedQuery作为重复,因为我不想每次两次查询时保持这个想法?我试图将命名的Query转换为native,所以我可以使用我的String替换“Select count(1)”但我不知道如何从查询中获取真正的SQL,或者如何从命名Query中构建criteriaQuery然后我可以在处理criteriaQuery时使用它。

0 个答案:

没有答案