Named Query 與 Navite Query


您可以將一些靜態的JPQL或SQL語句建立在同一個位置,這些靜態語句會有幾個參數有所不同,但基本上語句結構是相同的,避免將JPQL或SQL建立在程式中不同的位置,而造成日後修改時必須查看程式碼的麻煩。

在JPA中,可以使用@NamedQuery來建立Named Query,例如在 第一個 JPA(單機客戶端) 中,可以在User類別上建立Named Query:
....
@NamedQuery(
    name="QueryUserById",
    query="SELECT user FROM User user WHERE user.id = :userId"
)

@Entity
@Table(name="T_USER")
public class User implements Serializable {
    ...
}

在建立Query物件時,可以使用NamedQuery的name屬性取得NamedQuery:
        Query query = entityManager.createNamedQuery("QueryUserById");
        query.setParameter("userId", id);
        User user = (User) query.getSingleResult();

如果有多個NamedQuery要宣告,可以使用@NamedQueies來宣告,例如:
....
@NamedQueries ({
    @NamedQuery(
        name="QueryUserById",
        query="SELECT user FROM User user WHERE user.id = :userId"),
    @NamedQuery(
        name="UpdateUserById",
        query="UPDATE User user SET user.age = :userAge WHERE user.id = :userId"
    )
})

@Entity
@Table(name="T_USER")
public class User implements Serializable {
    ...
}

您可以使用Query物件的createNativeQuery()方法建立原生查詢(Native Query),也就是直接使用資料庫的SQL語法來進行查詢,對於無法使用JPQL查詢來取得資料時可以使用,例如:
    Query query = entityManager.createNativeQuery(
                         "SELECT * FROM T_USER", User.class);

    Iterator iterator =  query.getResultList().iterator();
    while(iterator.hasNext()) {
        User user = (User) iterator.next();
        System.out.println(user.getName());
    }