在JPA中可以通过@NamedQuery注解定义命名查询。
@NamedQuery注解用于在实体类上定义基于字符串的静态JPQL查询语句。
语法:
@NamedQuery(
name = "query_name",
query = "JPQL_SELECT_STATEMENT"
)
示例:
@Entity
@NamedQuery(
name = "findUserByUserName",
query = "SELECT u FROM User u WHERE u.userName = :username"
)
public class User { ... }
调用命名查询:
List<User> users = em.createNamedQuery("findUserByUserName", User.class)
.setParameter("username", "John")
.getResultList();
其中:
- name:命名查询的名称,在调用时使用。
- query:定义的JPQL查询语句。
- :username:设置命名参数,在查询中使用。
命名查询的优点:
- 可重用性:定义一次,多处调用。
- type safety:避免字符串的拼写错误。
- 可移植性:查询语句与Java代码解耦。
示例:
@Entity
@NamedQuery(name = "findUserByAge",
query = "SELECT u FROM User u WHERE u.age > :age")
public class User {
// ...
}
@Entity
@NamedQuery(name = "findAllUsers",
query = "SELECT u FROM User u")
public class User {
// ...
}
List<User> users = em.createNamedQuery("findUserByAge", User.class)
.setParameter("age", 30)
.getResultList();
List<User> allUsers = em.createNamedQuery("findAllUsers", User.class)
.getResultList();