在JPA中可以通过使用@Query注解定义本地SQL查询语句。这种方式称为本地查询。
@Query注解用于在实体类或Repository接口上定义基于SQL的查询语句。
语法:
@Query("SQL_SELECT_STATEMENT")
示例:
@Entity
public class User {
@Query("SELECT * FROM USERS WHERE NAME = ?1 AND AGE > ?2")
List<User> findUserByParams(String name, int age);
}
调用本地查询:
List<User> users = user.findUserByParams("John", 30);
其中:
- 方法的参数会自动映射到SQL查询中的位置参数。
- 方法的返回类型必须是查询结果类型或其子类型。
我们也可以在Repository接口上定义本地查询:
public interface UserRepository {
@Query("SELECT * FROM USERS WHERE NAME = ?1")
List<User> findByName(String name);
}
调用:
List<User> users = userRepository.findByName("John");
本地查询的优点:
- 支持原生SQL,可以使用数据库特有的功能。
- 性能更好,不需要通过EntityManager进行对象-关系映射。
- 可移植性更差,SQL语句依赖于特定数据库。
示例:
@Entity
public class User {
@Query("SELECT * FROM USERS WHERE NAME = ?1")
List<User> findByName(String name);
@Query("SELECT * FROM USERS WHERE AGE > ?1")
List<User> findByAge(int age);
}