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