在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(索引, 值)设置值。
命名参数的优点:
- 可读性更好,”:参数名”表达更清晰。
- 顺序无关,查询语句的修改不影响参数设置。
- 类型安全,字符串索引的使用可以避免错误。
示例:
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);