java - 创建条件语句,一次查询得到结果和行数

标签 java postgresql hibernate

我正在尝试获取结果以及单个查询中的行数以进行分页。

这是我到目前为止得到的:

public List<User> getUsers(int page, int size, boolean somecondition) {


    Criteria criteria = getSession().getCurrentSession().createCriteria(User.class);

    ProjectionList projectionList = Projections.projectionList();

    projectionList.add(Projections.property("name").as("name"));
    projectionList.add(Projections.property("createdAt").as("createdAt"));
    projectionList.add(Projections.property("id").as("id"));
    projectionList.add(Projections.rowCount());
    projectionList.add(Projections.groupProperty("id"));

    criteria.setProjection(projectionList);

    // pseudo Restrictions added
    if (somecondition) {
        criteria.add(Restrictions.isNotNull("email"));
    }

    if (somecondition) {
        criteria.add(Restrictions.isNotNull("name"));
    }

    // Now here do something to get the row count without doing a second query
    long count;

    ScrollableResults scrollableResults = criteria.scroll();
    scrollableResults.last();
    count = scrollableResults.getRowNumber() + 1;
    scrollableResults.close();

    log.info("users count : {}", count);

    criteria.setMaxResults(size);
    criteria.setFirstResult(page);

    criteria.setResultTransformer(new AliasToBeanResultTransformer(User.class));
    List<User> users = criteria.list();

    users.forEach(u -> log.info(u.toString()));

    return users;
}

read我可以使用 ScrollableResults 来获取行数而无需第二次查询,但这不起作用,我仍然在控制台中看到有 2 个查询。

我并不是要获取总结果,重要的是获取满足条件的结果的数量。

有什么建议吗?

最佳答案

这是我过去通过一次查询获取计数和结果的方式。

def result = Domain.createCriteria().list(max:10, offset:20){
                //conditions
             }
def count = result.totalCount

它给出了不受限制和偏移量影响的行总数。 希望对您有所帮助!

关于java - 创建条件语句,一次查询得到结果和行数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41365130/

相关文章:

java - 为什么现有文件不存在?

sql - PostgreSQL: "select where"查询过滤掉具有 [null] 值的记录

sql - 如何在正则表达式上连接表

java - Hibernate在执行delete语句时抛出ConstraintViolationException

java - Spring security loadByUsername 的用户名字段为空

java - Wicket CheckGoup 获取选中的项目 markupIds

Java 8 : Generating String ID from Long

postgresql - 有效地修剪 postgresql 表

hibernate - 如何在 Grails 中管理对象修订?

java - Hibernate 无法从数据库中获取 SequenceInformation