JPQL 的基本使用

Posted yunche

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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, "[email protected]").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());
    }

以上是关于JPQL 的基本使用的主要内容,如果未能解决你的问题,请参考以下文章

使用方法:JPQL或Criteria API? [关闭]

使用 JPQL/HQL 在 JPA 中订购连接获取的集合

使 JPQL/QueryDSL 不会产生可怕的查询

html PHP代码片段: - AJAX基本示例:此代码演示了使用PHP和JavaScript实现的基本AJAX功能。

JPQL语法总结对比原生sql

JPQL:未检测到命名参数