Spring Data 2027 @Query 注解:灵活构建自定义查询

张开发
2026/5/8 16:17:08 15 分钟阅读

分享文章

Spring Data 2027 @Query 注解:灵活构建自定义查询
Spring Data 2027 Query 注解灵活构建自定义查询核心概念Spring Data 2027 的 Query 注解允许开发者使用 JPQLJava Persistence Query Language或原生 SQL 编写自定义查询提供了比方法名查询更灵活的查询方式。Query 注解可以用于方法上指定查询语句支持参数绑定、结果映射等功能。工作原理Query 注解的工作原理如下查询定义在方法上使用 Query 注解指定 JPQL 或原生 SQL 查询语句参数绑定使用命名参数或位置参数绑定方法参数结果映射将查询结果映射到实体类或DTO查询执行Spring Data 执行查询并返回结果代码示例1. 基本用法// 基本 JPQL 查询 public interface UserRepository extends JpaRepositoryUser, Long { Query(SELECT u FROM User u WHERE u.name :name) User findByName(Param(name) String name); Query(SELECT u FROM User u WHERE u.age :age) ListUser findByAgeGreaterThan(Param(age) int age); Query(SELECT u FROM User u WHERE u.name LIKE %:name%) ListUser findByNameLike(Param(name) String name); } // 原生 SQL 查询 public interface UserRepository extends JpaRepositoryUser, Long { Query(value SELECT * FROM users WHERE name :name, nativeQuery true) User findByNameNative(Param(name) String name); Query(value SELECT * FROM users WHERE age :age, nativeQuery true) ListUser findByAgeGreaterThanNative(Param(age) int age); }2. 复杂查询// 复杂 JPQL 查询 public interface UserRepository extends JpaRepositoryUser, Long { Query(SELECT u FROM User u WHERE u.age BETWEEN :minAge AND :maxAge) ListUser findByAgeBetween(Param(minAge) int minAge, Param(maxAge) int maxAge); Query(SELECT u FROM User u WHERE u.name LIKE %:name% AND u.age :age) ListUser findByNameLikeAndAgeGreaterThan(Param(name) String name, Param(age) int age); Query(SELECT u FROM User u JOIN u.roles r WHERE r.name :roleName) ListUser findByRoleName(Param(roleName) String roleName); } // 复杂原生 SQL 查询 public interface UserRepository extends JpaRepositoryUser, Long { Query(value SELECT u.* FROM users u JOIN user_roles ur ON u.id ur.user_id JOIN roles r ON ur.role_id r.id WHERE r.name :roleName, nativeQuery true) ListUser findByRoleNameNative(Param(roleName) String roleName); Query(value SELECT u.* FROM users u WHERE u.created_at BETWEEN :startDate AND :endDate, nativeQuery true) ListUser findByCreatedAtBetweenNative(Param(startDate) LocalDateTime startDate, Param(endDate) LocalDateTime endDate); }3. 更新和删除操作// 更新操作 public interface UserRepository extends JpaRepositoryUser, Long { Modifying Query(UPDATE User u SET u.name :name WHERE u.id :id) int updateUserName(Param(id) Long id, Param(name) String name); Modifying Query(UPDATE User u SET u.age :age WHERE u.id :id) int updateUserAge(Param(id) Long id, Param(age) int age); } // 删除操作 public interface UserRepository extends JpaRepositoryUser, Long { Modifying Query(DELETE FROM User u WHERE u.id :id) int deleteUserById(Param(id) Long id); Modifying Query(DELETE FROM User u WHERE u.age :age) int deleteUsersByAgeLessThan(Param(age) int age); }4. 结果映射// 映射到实体类 public interface UserRepository extends JpaRepositoryUser, Long { Query(SELECT u FROM User u WHERE u.id :id) User findUserById(Param(id) Long id); } // 映射到DTO public interface UserRepository extends JpaRepositoryUser, Long { Query(SELECT new com.example.dto.UserDTO(u.id, u.name, u.email) FROM User u WHERE u.age :age) ListUserDTO findUserDTOsByAgeGreaterThan(Param(age) int age); } // 映射到投影 public interface UserProjection { Long getId(); String getName(); String getEmail(); } public interface UserRepository extends JpaRepositoryUser, Long { Query(SELECT u.id as id, u.name as name, u.email as email FROM User u WHERE u.age :age) ListUserProjection findUserProjectionsByAgeGreaterThan(Param(age) int age); }优势灵活性支持复杂的查询语句比方法名查询更灵活可读性查询语句清晰明了易于理解性能优化可以编写优化的查询语句提高查询性能类型安全JPQL 查询在编译时进行类型检查结果映射支持将查询结果映射到实体类、DTO 或投影实际应用场景复杂查询需要编写复杂的查询语句性能优化需要优化查询性能自定义结果需要返回自定义的结果集原生 SQL需要使用原生 SQL 语句批量操作需要执行批量更新或删除操作最佳实践使用命名参数使用命名参数:name而不是位置参数?1提高代码可读性合理使用原生 SQL对于复杂查询考虑使用原生 SQL优化查询语句编写高效的查询语句避免全表扫描使用索引为查询条件涉及的字段创建索引结果映射根据需要选择合适的结果映射方式测试查询测试查询语句的正确性和性能注意事项SQL 注入使用参数绑定避免 SQL 注入性能问题复杂的查询语句可能会影响性能数据库兼容性原生 SQL 可能在不同数据库中存在兼容性问题维护难度复杂的查询语句可能会增加维护难度事务管理更新和删除操作需要在事务中执行总结Spring Data 2027 的 Query 注解为开发者提供了一种灵活构建自定义查询的方式支持 JPQL 和原生 SQL适用于各种复杂的查询场景。通过合理使用 Query 注解可以编写高效、清晰的查询语句提高应用的性能和可维护性。别叫我大神叫我 Alex 就好。这其实可以更优雅一点Spring Data 2027 的 Query 注解让自定义查询变得更加简单和灵活。

更多文章