JpaRepository是Spring Data JPA提供的接口,用于简化数据库操作。它继承自PagingAndSortingRepository和CrudRepository,提供了基本的CRUD操作以及分页和排序功能。
Spring Data JPA支持通过方法名自动生成查询:
public interface UserRepository extends JpaRepository<User, Long> {
// 精确匹配
List<User> findByUsername(String username);
// 模糊匹配
List<User> findByUsernameContaining(String username);
List<User> findByUsernameLike(String username);
// 忽略大小写匹配
List<User> findByUsernameIgnoreCase(String username);
// 多条件匹配
List<User> findByUsernameAndEmail(String username, String email);
}
public interface UserRepository extends JpaRepository<User, Long> {
@Query("SELECT u FROM User u WHERE u.username LIKE %:keyword%")
List<User> searchByKeyword(@Param("keyword") String keyword);
@Query("SELECT u FROM User u WHERE u.username = :username AND u.active = true")
List<User> findActiveUsersByUsername(@Param("username") String username);
}
public interface UserRepository extends JpaRepository<User, Long>, JpaSpecificationExecutor<User> {
// 可以在服务层构建动态查询条件
}
// 服务层使用示例
public List<User> findUsers(String username, Boolean active) {
return userRepository.findAll((root, query, cb) -> {
List<Predicate> predicates = new ArrayList<>();
if (username != null) {
predicates.add(cb.like(root.get("username"), "%" + username + "%"));
}
if (active != null) {
predicates.add(cb.equal(root.get("active"), active));
}
return cb.and(predicates.toArray(new Predicate[0]));
});
}
public interface UserRepository extends JpaRepository<User, Long>, QuerydslPredicateExecutor<User> {
// 可以使用Q类进行类型安全的查询
}
// 使用示例
QUser user = QUser.user;
BooleanExpression predicate = user.username.contains("admin")
.and(user.active.eq(true));
Iterable<User> users = userRepository.findAll(predicate);
原因:当查询实体关联的其他实体时,可能会触发多次查询
解决方案:
// 使用JOIN FETCH
@Query("SELECT u FROM User u JOIN FETCH u.roles WHERE u.username = :username")
User findUserWithRolesByUsername(@Param("username") String username);
// 或者使用@EntityGraph
@EntityGraph(attributePaths = {"roles"})
List<User> findByUsername(String username);
解决方案:
Page<User> findByUsernameContaining(String username, Pageable pageable);
解决方案:使用@Query编写原生SQL或JPQL,或者使用Specification构建动态查询