JPA中如何使用命名参数查询?

在JPA中可以通过”:参数名”的形式在JPQL查询中定义命名参数,然后在查询执行时设置参数值。
命名参数示例:

String jpql = "SELECT u FROM User u WHERE u.name = :name AND u.age > :age";
Query query = em.createQuery(jpql);
query.setParameter("name", "John");
query.setParameter("age", 30);
List<User> users = query.getResultList();

其中:

  • :name和:age代表命名参数。
  • 使用query.setParameter()方法设置参数值。

查询支持的参数类型有:

  • 字符串、数字、日期等基本类型。
  • 实体对象。
  • Collection类型。

示例:

// 基本类型
query.setParameter("age", 30);  

// 实体对象  
User user = new User();
query.setParameter("user", user);  

// Collection类型
List<String> names = new ArrayList<>();  
names.add("John");
names.add("Jane");   
query.setParameter("names", names);

命名参数 VS 位置参数:

  • 命名参数:通过”:参数名”的形式在JPQL中定义, query.setParameter(“参数名”, 值)设置值。
  • 位置参数:使用”?”在JPQL中定义,query.setParameter(索引, 值)设置值。

命名参数的优点:

  1. 可读性更好,”:参数名”表达更清晰。
  2. 顺序无关,查询语句的修改不影响参数设置。
  3. 类型安全,字符串索引的使用可以避免错误。

示例:

String jpql = "SELECT u FROM User u WHERE u.name = ?1 AND u.age > ?2"; 
Query query = em.createQuery(jpql);
query.setParameter(1, "John");  
query.setParameter(2, 30);