一、概念
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()); }