• 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());
      }
      
  • 相关阅读:
    nginx变量(日志log_format)
    nginx中间件
    social-auth-app-django集成第三方登录
    Django REST Framework限速
    django-redis
    Django REST Framework extensions
    django-rest-framework-jwt
    FromXml 支付回调 xml 转数组
    下个月此时
    PHP 暂停函数 sleep() 与 usleep() 的区别
  • 原文地址:https://www.cnblogs.com/yunche/p/10294249.html
Copyright © 2020-2023  润新知