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);
}
我有这个代码
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);
}