JPA中如何使用命名查询?

在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:设置命名参数,在查询中使用。

命名查询的优点:

  1. 可重用性:定义一次,多处调用。
  2. type safety:避免字符串的拼写错误。
  3. 可移植性:查询语句与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();