JPA JPQL高级操作

使用JPQL,我们可以执行任何类型的数据库操作。 在这里,我们将使用简单的例子来执行JPQL的一些高级操作。

假设当前student表有如下数据 -

DROP TABLE IF EXISTS `student`;
CREATE TABLE `student` (
  `S_ID` int(11) NOT NULL,
  `S_NAME` varchar(255) DEFAULT NULL,
  `S_AGE` int(11) DEFAULT NULL,
  PRIMARY KEY (`S_ID`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

-- ----------------------------
-- Records of student
-- ----------------------------
INSERT INTO `student` VALUES (‘101‘, ‘Gaurav‘, ‘24‘);
INSERT INTO `student` VALUES (‘102‘, ‘Rahul‘, ‘22‘);
INSERT INTO `student` VALUES (‘103‘, ‘Chris‘, ‘20‘);
INSERT INTO `student` VALUES (‘104‘, ‘Ronit‘, ‘26‘);
INSERT INTO `student` VALUES (‘105‘, ‘Roy‘, ‘21‘);

SQL

JPQL高级查询示例

在这个例子中,我们将采用一个基本的实体类(StudentEntity.java)并对其执行不同的操作。

com.yiibai.jpa包下创建一个名为StudentEntity.java的实体类。

文件:StudentEntity.java -

package com.yiibai.jpa;

import javax.persistence.*;

@Entity
@Table(name = "student")
public class StudentEntity {

    @Id
    private int s_id;
    private String s_name;
    private int s_age;

    public StudentEntity(int s_id, String s_name, int s_age) {
        super();
        this.s_id = s_id;
        this.s_name = s_name;
        this.s_age = s_age;
    }

    public StudentEntity() {
        super();
    }

    public int getS_id() {
        return s_id;
    }

    public void setS_id(int s_id) {
        this.s_id = s_id;
    }

    public String getS_name() {
        return s_name;
    }

    public void setS_name(String s_name) {
        this.s_name = s_name;
    }

    public int getS_age() {
        return s_age;
    }

    public void setS_age(int s_age) {
        this.s_age = s_age;
    }

}

Java

现在,将实体类和其他数据库配置映射到Persistence.xml文件中。
文件:persistence.xml -

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.1"
    xmlns="http://xmlns.jcp.org/xml/ns/persistence"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd">
    <persistence-unit name="Student_details">
        <class>com.yiibai.jpa.StudentEntity</class>
        <properties>
            <property name="javax.persistence.jdbc.driver"
                value="com.mysql.jdbc.Driver" />
            <property name="javax.persistence.jdbc.url"
                value="jdbc:mysql://localhost:3306/testdb?serverTimezone=UTC" />
            <property name="javax.persistence.jdbc.user" value="root" />
            <property name="javax.persistence.jdbc.password"
                value="123456" />
            <property name="eclipselink.logging.level" value="SEVERE" />
            <property name="eclipselink.ddl-generation"
                value="create-or-extend-tables" />
        </properties>
    </persistence-unit>

</persistence>

XML

现在,我们可以在StudentEntity.java类中执行以下操作。

1. JPQL筛选器

在这里,我们将在student表上执行一些过滤操作。

文件:Filter.java -

package com.yiibai.jpa.jpql;

import com.yiibai.jpa.StudentEntity;
import javax.persistence.*;
import java.util.*;

public class Filter {

    public static void main(String args[]) {

        EntityManagerFactory emf = Persistence.createEntityManagerFactory("Student_details");
        EntityManager em = emf.createEntityManager();
        em.getTransaction().begin();

        Query q1 = em.createQuery("Select s from StudentEntity s where s.s_age between 22 and 28");

        @SuppressWarnings("unchecked")
        List<StudentEntity> l1 = (List<StudentEntity>) q1.getResultList();

        System.out.println("Between Clause");
        System.out.print("s_id");
        System.out.print("\t s_name");
        System.out.println("\t s_age");

        for (StudentEntity s : l1) {
            System.out.print(s.getS_id());
            System.out.print("\t" + s.getS_name());
            System.out.println("\t" + s.getS_age());
        }

        Query q2 = em.createQuery("Select s from StudentEntity s where s.s_age IN(20,22,23)");

        @SuppressWarnings("unchecked")
        List<StudentEntity> l2 = (List<StudentEntity>) q2.getResultList();

        System.out.println("IN Clause");
        System.out.print("s_id");
        System.out.print("\t s_name");
        System.out.println("\t s_age");

        for (StudentEntity s : l2) {
            System.out.print(s.getS_id());
            System.out.print("\t" + s.getS_name());
            System.out.println("\t" + s.getS_age());
        }

        Query q3 = em.createQuery("Select s from StudentEntity s where s.s_name like ‘%a%‘");

        @SuppressWarnings("unchecked")
        List<StudentEntity> l3 = (List<StudentEntity>) q3.getResultList();

        System.out.println("Like Clause");
        System.out.print("s_id");
        System.out.print("\t s_name");
        System.out.println("\t s_age");

        for (StudentEntity s : l3) {
            System.out.print(s.getS_id());
            System.out.print("\t" + s.getS_name());
            System.out.println("\t" + s.getS_age());
        }

        em.getTransaction().commit();
        em.close();
        emf.close();
    }
}

Java

执行上面示例代码,得到以下结果 -

Between Clause
s_id     s_name     s_age
101    Gaurav    24
102    Rahul    22
104    Ronit    26
IN Clause
s_id     s_name     s_age
102    Rahul    22
103    Chris    20
Like Clause
s_id     s_name     s_age
101    Gaurav    24
102    Rahul    22

Shell

2. JPQL聚合

在这里,我们将在student表上执行一些聚合操作。

文件:Aggregate.java -

package com.yiibai.jpa.jpql;

import com.yiibai.jpa.StudentEntity;
import javax.persistence.*;
import java.util.*;

public class Aggregate {

    public static void main(String args[]) {

        EntityManagerFactory emf = Persistence.createEntityManagerFactory("Student_details");
        EntityManager em = emf.createEntityManager();
        em.getTransaction().begin();

        Query q1 = em.createQuery("Select count(s) from StudentEntity s");
        System.out.println("Number of Student : " + q1.getSingleResult());

        Query q2 = em.createQuery("Select MAX(s.s_age) from StudentEntity s");
        System.out.println("Maximum age : " + q2.getSingleResult());

        Query q3 = em.createQuery("Select MIN(s.s_age) from StudentEntity s");
        System.out.println("Minimum age : " + q3.getSingleResult());
        em.getTransaction().commit();
        em.close();
        emf.close();
    }
}

Java

执行上面示例代码,得到以下结果 -

Number of Student : 5
Maximum age : 26
Minimum age : 20

Shell

3. JPQL排序

在这里,我们将基于s_age属性(列)对表的元素进行排序。

文件: Sorting.java -

package com.yiibai.jpa.jpql;

import com.yiibai.jpa.StudentEntity;
import javax.persistence.*;
import java.util.*;

public class Sorting {

    public static void main(String args[]) {

        EntityManagerFactory emf = Persistence.createEntityManagerFactory("Student_details");
        EntityManager em = emf.createEntityManager();
        em.getTransaction().begin();

        Query q1 = em.createQuery("Select s from StudentEntity s order by s.s_age desc");

        @SuppressWarnings("unchecked")
        List<StudentEntity> l1 = (List<StudentEntity>) q1.getResultList();

        System.out.print("s_id");
        System.out.print("\t s_name");
        System.out.println("\t s_age");

        for (StudentEntity s : l1) {
            System.out.print(s.getS_id());
            System.out.print("\t" + s.getS_name());
            System.out.println("\t" + s.getS_age());
        }

        em.getTransaction().commit();
        em.close();
        emf.close();
    }
}

Java

执行上面示例代码,得到以下结果 -

s_id     s_name     s_age
104    Ronit    26
101    Gaurav    24
102    Rahul    22
105    Roy    21
103    Chris    20

原文地址:https://www.cnblogs.com/borter/p/12423994.html

时间: 2024-10-09 22:06:49

JPA JPQL高级操作的相关文章

线程高级操作(二)

之前在线程高级操作中说到了线程的高级操作包括修改线程的属性和进行线程之间的同步操作.线程的同步有两种方式,一种是使用互斥量一种是使用读写锁.上一篇文章说的是互斥量,这篇文章主要介绍的是读写锁. 读写锁与互斥量类似,但是读写锁相对于互斥量来说最大的特点就是并行性高.互斥锁每次只有一个线程可以得到锁进行操作,其他的线程处于阻塞状态.多线程的意义就在于高并发性,但是使用互斥量就会将并行操作编程串行操作,程序的效率会大打折扣. 读写锁的优点是读写锁分为两种,读线程和写线程.读线程只对共享资源进行读操作,

数据库的高级操作

高级操作 复制表结构 语法: ????create table 表B like 表A; 示例: 复制表中的数据 语法: ????create table 表B select *或字段列表 from 表A; 蠕虫复制 语法: ????insert into 表名[(字段列表)] select *或字段列表 from 表名; 修改操作 ????限制修改指定的行数. 语法: ????update 表名 set 字段=值... [where子句] limit n; 说明: ????在执行update语句

Eclipse高级操作 远程调试

Eclipse高级操作 远程调试 JPDA是SUN JDK自带的远程调试机制.它提供了一套标准的调试接口,可以从虚拟机一级允许外界用特定协议探测虚拟机内部的运作细节.只要你装了JDK1.2以上的SUN JDK,就已经有了JPDA支持.只要是用标准SUN JDK中java.exe运行的应用,就可以用JPDA进行远程调试.以WEB应用的开发为例,servlet和ejb的调试一直不是一件太容易的事情.虽然Jbuilder/Eclipse等有一些常见的应用服务器,如tomcat/weblogic的调试插

Git高级操作

本文是在Git操作指南基础上衍生出来的高级操作,如果你对git不是很熟悉,建议你先阅读Git操作指南. 一.忽略提交特定文件 如果你不想让一些文件上传到git仓库中,可以让Git忽略特定文件或是目录,通过vi ~/.gitconfig编辑git的配置文件,可以使用感叹号(注意英文)来指出例外的情况. 1 !*.a //所有文件后缀为a的都不提交 2 !/demo/ //文件demo下的所有文件都不提交 二.查看仓库历史记录 git log 用来查看仓库历史记录,有三个参数: oneline——把

【转载】8天学通MongoDB——第三天 细说高级操作

今天跟大家分享一下mongodb中比较好玩的知识,主要包括:聚合,游标. 一: 聚合 常见的聚合操作跟sql server一样,有:count,distinct,group,mapReduce. <1> count count是最简单,最容易,也是最常用的聚合工具,它的使用跟我们C#里面的count使用简直一模一样. <2> distinct 这个操作相信大家也是非常熟悉的,指定了谁,谁就不能重复,直接上图. <3> group 在mongodb里面做group操作有点

sql高级操作

同样也是用于记录以便日后联系用!里面基本包含了一般sql的高级用法! drop table if exists stu; create table stu( name varchar(30), age int, stuid int not null PRIMARY key AUTO_INCREMENT, idnum int, sex varchar(30), check(sex in ('男','女')) )charset=utf8; insert into stu (name,age,idnu

selenium学习笔记——高级操作

这篇主要介绍一下页面的高级操作:页面跳转.单选下拉框选择.frame切换.鼠标悬停.非网页弹窗 一.页面跳转/窗口跳转 两种方式:不关闭原窗口和关闭原窗口,建议采用第二种关闭原窗口这种方式   不关闭原窗口: 1 //获取当前窗口的句柄 2 String orighandle = driver.getWindowHandle(); 3 //遍历所有句柄 4 for(String handle : driver.getWindowHandles()){ 5 // 如果不是原窗口的句柄,那么就把句柄

Unix_文件系统高级操作_0

这是<UNIX初级教程>_第8章 UNIX文件系统高级操作的内容 感觉这一章的内容还是挺多的:(注:其间的下划线“_”是把命令与其它文字隔开,它不是命令的一部分) 1 读文件:只读版本view命令.读文件pg命令(MaoBook Os的命令中没有它,略过) 2 shell重定向:输出重定向,输入重定向 3 增强的文件打印功能_略过 4 文件操作命令:复制文件_cp命令.移动文件_mv命令.链接文件_ln命令.计算数字_wc命令. 5 文件名替换:?元字符|*元字符|[ ]元字符.元字符与隐藏文

黑马程序员(Java)----API之常用类(数组的高级操作、正则表达式)

------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 4.7 Array的高级操作 4.7.1 排序 1.冒泡排序 相邻元素两两比较,大的往后放,第一次完毕,最大值出现在了最大索引处. import java.awt.image.BufferStrategy; public class ArrayDemo2 { public static void main(String[] args) { // 定义一个数组 int[] arr = { 24,