您可以將一些靜態的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 {
...
}
@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 {
...
}
@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());
}