JPQL 的基本使用

一、概念

JPQL 语言,即 Java Persistence Query Language 的简称。JPQL 和 HQL 是非常类似的,支持以面向对象的方式来写 SQL 语句,当然也支持本地的 SQL 语句。JPQL 最终会被编译成针对不同底层数据库的 SQL 查询从而屏蔽掉不同数据库的差异。

1、API

javax.persistence.Query 接口封装了执行数据查询的相关方法。主要方法如下:

  • int executeUpdate():用于执行 update 或 delete 语句。
  • List getResult():用于执行 select 语句并返回结果集实体列表。
  • Object getSingleResult():用于执行返回单个结果实体的 select 语句。
  • Query setFirstResult(int startPosition):用于设置从指定行数返回查询结果。
  • Query setMaxResults(int maxResult):用于设置结果实体的最大数目。
  • setParameter(int position, Object value):为查询语句的指定位置参数赋值。下标从 1 开始。

二、用法实例

  • 查询:

    package test.java;
    
    import com.yunche.helloworld.Customer;
    import com.yunche.helloworld.Order;
    import org.junit.After;
    import org.junit.Before;
    import org.junit.Test;
    
    import javax.persistence.*;
    import java.util.HashSet;
    import java.util.List;
    import java.util.Set;
    
    /**
     * @ClassName: MappingTest
     * @Description: 测试类
     * @author: yunche
     * @date: 2019/01/18
     */
    public class MappingTest {
    
        private EntityManagerFactory entityManagerFactory;
        private EntityManager entityManager;
        private EntityTransaction transaction;
    
        @Before
        public void init() {
            entityManagerFactory = Persistence.createEntityManagerFactory("jpa-1");
            entityManager = entityManagerFactory.createEntityManager();
            transaction = entityManager.getTransaction();
            transaction.begin();
        }
    
        @After
        public void destroy() {
            transaction.commit();
            entityManager.close();
            entityManagerFactory.close();
        }
    
        @Test
        public void testSelectJPQL() {
            String jpql = "FROM Customer WHERE id = ?1";
            Query query = entityManager.createQuery(jpql);
            query.setParameter(1, 1);
            Customer customer = (Customer) query.getSingleResult();
            System.out.println(customer.getName());
        }
    }
    
  • 修改:

    @Test
    public void testUpdateJPQL() {
        String jpql = "UPDATE Customer SET name=?1 WHERE id=?2";
        Query query = entityManager.createQuery(jpql);
        query.setParameter(1, "Bob").setParameter(2, 1);
        // 返回受影响的行数
        System.out.println(query.executeUpdate());
    }
    
  • 添加(没有 INSERT):

    /**
     * 试了下, JPQL 中没有 INSERT 这个测试用例是通不过的
     * 可能为了让们我尽量使用 EntityManager 中的 persist() 方法吧,也是 JPA 毕竟提倡我们少写 SQL
     */
    @Test
    public void testInsertJPQL() {
        String jpql = "INSERT INTO Customer(name, email, age) VALUES(?1, ?2, ?3)";
        Query query = entityManager.createQuery(jpql);
        query.setParameter(1, "Mike").setParameter(2, "Mike@163.com").setParameter(3, 20);
        System.out.println(query.executeUpdate());
    }
    
  • 删除:

    @Test
    public void testDeleteJPQL() {
        String jpql = "DELETE FROM Customer WHERE id = ?1";
        Query query = entityManager.createQuery(jpql);
        query.setParameter(1, 1);
        System.out.println(query.executeUpdate());
    }
    
posted @   云--澈  阅读(3352)  评论(1编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!
点击右上角即可分享
微信分享提示