Hibernate5:如何为记录计数查询获取 Root<Long>?

Hibernate5: how to get Root<Long> for a record-count query?

我有这个代码

final Session session = sessionFactory.getCurrentSession();
final CriteriaBuilder builder = sessionFactory.getCriteriaBuilder();
final CriteriaQuery<ListingDetailBaseDto> criteria = builder.createQuery(ListingDetailBaseDto.class);
final Root<ListingDetailBaseDto> root = criteria.from(ListingDetailBaseDto.class);

...

public int countRecords() {
    final CriteriaQuery<Long> countingQuery = builder.createQuery(Long.class);
    countingQuery.select(countingQuery.from(Long.class));
    countingQuery.select(builder.count(root));
    final Query<Long> query = session.createQuery(countingQuery);
    return query.getSingleResult().intValue();
}       

它说 Long 不是一个有效的实体。所以我删除了第 3 行,

public int countRecords() {
    final CriteriaQuery<Long> countingQuery = builder.createQuery(Long.class);
    countingQuery.select(builder.count(root));
    final Query<Long> query = session.createQuery(countingQuery);
    return query.getSingleResult().intValue();
}   

然后错误变为:No criteria query roots were specified

如何获得这个简单的记录数???

感谢@O.Badr 询问 root,这让我更仔细地查看了那部分代码。

问题是由于使用来自不同 CriteriaQuery 对象的 root 引起的。

固定代码:

public int countRecords() {
    final CriteriaQuery<Long> countingQuery = builder.createQuery(Long.class);
    countingQuery.select(builder.count(countingQuery.from(ListingDetailBaseDto.class)));
    final Query<Long> query = session.createQuery(countingQuery);
    return query.getSingleResult().intValue();
}       

稍微偏离主题,但我们放弃了休眠模式,我觉得好多了。

class ListingDetailsDao extends JdbcDaoSupport {

    public ListingDetailsDao (@Autowired @Qualifier("myDataSource") DataSource dataSource) {

        setDataSource(dataSource);
    }

    public int count() {

        final String sql = "select count (*) from listing_details";
        return getJdbcTemplate().queryForObject(sql, Integer.class);
    }