在 SQL 语句中,提供了很多常用的聚合函数,如:avg()、count()、max() 和 min() 等等。下面将介绍在 JPQL 中怎样使用聚合函数。
(1)配置 persistence.xml,如下:
<persistence xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="1.0"> <persistence-unit name="openJPA2" transaction-type="RESOURCE_LOCAL"> <!-- JPA提供者 --> <provider>org.apache.openjpa.persistence.PersistenceProviderImpl</provider> <!-- 声明实体类 --> <class>com.hxstrive.openjpa.entity2.User</class> <!-- 配置JPA数据库属性 --> <properties> <property name="openjpa.ConnectionURL" value="jdbc:mysql://localhost:3306/openjpa_learn?useSSL=false& serverTimezone=UTC&useUnicode=true&characterEncoding=UTF-8"/> <property name="openjpa.ConnectionDriverName" value="com.mysql.jdbc.Driver"/> <property name="openjpa.ConnectionUserName" value="root"/> <property name="openjpa.ConnectionPassword" value="aaaaaa"/> <property name="openjpa.Log" value="SQL=TRACE"/> <!-- 自动生成表 --> <property name="openjpa.jdbc.SynchronizeMappings" value="buildSchema(ForeignKeys=true)"/> <!-- 不使用加载时强化和编译时强化,使用运行时Unenhanced(不能发挥OpenJPA的最大效能,所以也不推荐) --> <property name="openjpa.ClassLoadEnhancement" value="false"/> <property name="openjpa.DynamicEnhancementAgent" value="false"/> <property name="openjpa.RuntimeUnenhancedClasses" value="supported"/> </properties> </persistence-unit> </persistence>
(2)用户表实体映射,代码如下:
@Data @Entity @Table public class User { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Integer id; @Column private String name; @Column private Integer age; @Column private Float salary; }
avg 函数返回数值列的平均值。NULL 值不包括在计算中。下面代码计算用户平均年龄,如下:
private void avg(EntityManager em) { try { em.getTransaction().begin(); Query query = em.createQuery("Select avg(s.age) from User s"); System.out.println("平均年龄:" + query.getSingleResult()); em.getTransaction().commit(); } finally { em.close(); } }
输出 SQL 如下:
SELECT AVG(t0.age) FROM User t0 平均年龄:57
该函数返回匹配指定条件的行数。下面将统计用户数,代码如下:
private void count(EntityManager em) { try { em.getTransaction().begin(); Query query = em.createQuery("Select count(u) from User u"); System.out.println("用户数:" + query.getSingleResult()); em.getTransaction().commit(); } finally { em.close(); } }
输出 SQL 如下:
SELECT COUNT(t0.id) FROM User t0 用户数:10
该函数返回一列中的最大值,NULL 值不包括在计算中。下面代码将统计用户最高薪水,如下:
private void max(EntityManager em) { try { em.getTransaction().begin(); Query query = em.createQuery("Select max(u.salary) from User u"); System.out.println("最高薪水:" + query.getSingleResult()); em.getTransaction().commit(); } finally { em.close(); } }
输出 SQL 如下:
SELECT MAX(t0.salary) FROM User t0 最高薪水:8892.097
该函数返回一列中的最小值,NULL 值不包括在计算中。下面将统计用户最低薪水,如下:
private void min(EntityManager em) { try { em.getTransaction().begin(); Query query = em.createQuery("Select min(u.salary) from User u"); System.out.println("最低薪水:" + query.getSingleResult()); em.getTransaction().commit(); } finally { em.close(); } }
输出 SQL 如下:
SELECT MIN(t0.salary) FROM User t0 最低薪水:2927.5222
该函数返回数值列的总数(总额)。下面代码将统计用户薪水总额,如下:
private void sum(EntityManager em) { try { em.getTransaction().begin(); Query query = em.createQuery("Select sum(u.salary) from User u"); System.out.println("总薪水:" + query.getSingleResult()); em.getTransaction().commit(); } finally { em.close(); } }
输出 SQL 如下:
SELECT SUM(t0.salary) FROM User t0 总薪水:58353.918