Hibernate JPA-jpa中使用count计数

本文介绍了如何在Spring Data JPA中利用Hibernate实现数据计数功能。通过继承CrudRepository并利用其提供的count方法,可以轻松地在DAO层实现对数据的计数操作。

文章目录

Hibernate JPA

CrudRepository的源码 里面有一个函数:

/**
     * Returns the number of entities available.
     * 
     * @return the number of entities
     */
    long count();

于是继承了CrudRepository :

spring data jpa中使用count计数方法很简单,直接在dao层写方法即可:

例如:

Long countByUserId(Long userId);
Hibernate中映射计数项可以通过以下几种常见方式实现。 ### 使用JPQL 可以使用JPQL(Java Persistence Query Language)编写查询来进行计数。例如,假设有一个`Routinework`实体类,要统计满足一定条件的记录数量,可以这样写: ```java import javax.persistence.EntityManager; import javax.persistence.PersistenceContext; import javax.persistence.TypedQuery; public class RoutineworkRepository { @PersistenceContext private EntityManager entityManager; public Long countRoutineworks() { String jpql = "SELECT COUNT(r) FROM Routinework r WHERE r.deleted = false AND r.status = '审批通过'"; TypedQuery<Long> query = entityManager.createQuery(jpql, Long.class); return query.getSingleResult(); } } ``` 这里通过`COUNT(r)`对`Routinework`实体满足特定条件的记录进行计数。 ### 使用原生SQL 如果需要更复杂的查询或者利用数据库特定的功能,也可以使用原生SQL查询。如示例中求总工时的统计,使用`@Query`注解结合原生SQL: ```java import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.Repository; import java.time.Instant; public interface RoutineworkRepository extends Repository<Routinework, Long> { @Query(value = "select sum(work.manhour) as manhours from Routinework work " + "left join work.routinelabels lable on lable.deleted = false " + "where 1 = 1 " + "and ((:startDate is null and :endDate is null) or work.approverTime between :startDate and :endDate) " + "and (not work.approver is null) " + "and (not work.approverTime is null) " + "and (work.deleted = false) " + "and (work.status = '审批通过') ", nativeQuery = true) Double sumManhour(@Param("startDate") Instant startDate, @Param("endDate") Instant endDate); } ``` 此例虽然是求和,但可以修改为计数,如将`sum(work.manhour)`改为`count(*)`来统计满足条件的记录数。 ### Criteria API Hibernate的Criteria API也可用于构建查询进行计数。以下是一个简单示例: ```java import javax.persistence.EntityManager; import javax.persistence.PersistenceContext; import javax.persistence.criteria.CriteriaBuilder; import javax.persistence.criteria.CriteriaQuery; import javax.persistence.criteria.Root; public class RoutineworkRepository { @PersistenceContext private EntityManager entityManager; public Long countRoutineworksByStatus(String status) { CriteriaBuilder cb = entityManager.getCriteriaBuilder(); CriteriaQuery<Long> cq = cb.createQuery(Long.class); Root<Routinework> root = cq.from(Routinework.class); cq.select(cb.count(root)); cq.where(cb.equal(root.get("status"), status)); return entityManager.createQuery(cq).getSingleResult(); } } ``` 这里使用Criteria API构建了一个查询,对满足特定状态的`Routinework`实体进行计数
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

西京刀客

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值