JPQL 聚合查询

在 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&amp;
                      serverTimezone=UTC&amp;useUnicode=true&amp;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() 计算平均值

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

count() 统计数量

该函数返回匹配指定条件的行数。下面将统计用户数,代码如下:

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

max() 计算最大值

该函数返回一列中的最大值,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

min() 计算最小值

该函数返回一列中的最小值,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

sum() 求和

该函数返回数值列的总数(总额)。下面代码将统计用户薪水总额,如下:

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
说说我的看法
全部评论(
没有评论
关于
本网站专注于 Java、数据库(MySQL、Oracle)、Linux、软件架构及大数据等多领域技术知识分享。涵盖丰富的原创与精选技术文章,助力技术传播与交流。无论是技术新手渴望入门,还是资深开发者寻求进阶,这里都能为您提供深度见解与实用经验,让复杂编码变得轻松易懂,携手共赴技术提升新高度。如有侵权,请来信告知:hxstrive@outlook.com
公众号