Java Persistence Query Language簡介JPQL,是個中介的查詢語言規範,根據實際所使用的資料庫不同,透過設定,可以將JPQL轉譯為資料庫所使用的原生語法,JPQL 提供選取、更新與刪除的語法,若要透過JPQL來進行選取、更新與刪除等操作,則可透過EntityManager建立Query物件來達成。
以 第一個 JPA(單機客戶端) 為例,若要查詢T_USER表格中的資料,可以如下:
EntityManager entityManager =
JPAUtil.getEntityManagerFactory().createEntityManager();
Query query = entityManager.createQuery("SELECT user FROM User user");
Iterator users = query.getResultList().iterator();
while(users.hasNext()) {
User user = (User) users.next();
System.out.printf("%d\t%s\t%d\n",
user.getId(),
user.getName(),
user.getAge());
}
entityManager.close();
您可以透過EntityManager的createQuery()搭配JPQL語句來建立Query物件,在這邊是指定為select語句,若要取得查 詢結果,則是透過Query的getResultList()方法來取回,該方法傳回List物件,當中每個物件皆已將表格的資訊封裝為User實例。
在建立JPQL時,可以在JPQL中的參數處使用位置參數(Positional Parameter),例如,若要查詢表格中使用者名稱為"justin"的使用者之年齡,可以如下撰寫:
EntityManager entityManager =
JPAUtil.getEntityManagerFactory().createEntityManager();
Query query = entityManager.createQuery(
"SELECT user.age FROM User user WHERE user.name = ?1");
query.setParameter(1, "Justin Lin");
Long age = (Long) query.getSingleResult();
System.out.println("age: " + age);
entityManager.close();
注意位置參數的寫法是?後加上數字(1到9),而要指定位置參數的值,則指定位置參數的數字,如範例中的setParameter()方法,在這邊也示範了Query的getSingleResult()方法,可用於取得單一個查詢結果,而查詢時若只想查詢某個或某幾個屬性,則如上例中,直接接上屬性名稱即可,查詢的結果會自動封裝為對應的物件。
JPQL也可以用具名參數(Named Parameter)作為佔位字,例如:
EntityManager entityManager =
JPAUtil.getEntityManagerFactory().createEntityManager();
Query query = entityManager.createQuery(
"SELECT user.age FROM User user WHERE user.name = :userName");
query.setParameter("userName", "Justin Lin");
Long age = (Long) query.getSingleResult();
System.out.println("age: " + age);
entityManager.close();
具名參數作為佔位字時,是在:後跟隨著名稱,而使用setParameter()方法時,則可指定實際的名稱。
Query可以使用setMaxResults()指定傳回的資料最大筆數,使用setFirstResult()指定資料起始位置。
若要修改或刪除資料,則是透過executeUpdate()方法,例如以下示範資料的更新:
EntityManager entityManager =
JPAUtil.getEntityManagerFactory().createEntityManager();
EntityTransaction etx = entityManager.getTransaction();
etx.begin();
Query query = entityManager.createQuery(
"UPDATE User user SET user.age = :userAge WHERE user.name = :userName");
query.setParameter("userAge", 35);
query.setParameter("userName", "Justin Lin");
query.executeUpdate();
etx.commit();
entityManager.close();