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());
    }
    


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM