使用 Query 物件


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