You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring Boot中如何实现带WHERE条件的表数据查询?(以查询年龄为5的宠物为例)

实现按年龄查询宠物的Spring Data JPA方案

嘿,你问的这个问题刚好是Spring Data JPA最常用的场景之一!其实Spring Data JPA给我们提供了两种非常便捷的方式来实现这个需求:基于方法名的自动查询(类似你已经用的findAll、findById),或者自定义查询语句。下面我给你一步步拆解:

一、最简单的方式:基于方法名的自动查询

Spring Data JPA会根据你定义的方法名自动生成对应的SQL语句,完全不需要你手写SQL。你只需要在PetRepository里添加一个符合命名规则的方法就行:

修改后的PetRepository.java

public interface PetRepository extends JpaRepository<Pet, Integer> {
    // 自动生成SELECT * FROM pets WHERE age = ? 的SQL
    List<Pet> findByAge(int age);
}

接下来完善Service层

在PetService接口里添加对应的方法:

public interface PetService {
    List<Pet> getAllPets();
    Pet getPetById(int petId);
    // 新增按年龄查询的方法
    List<Pet> getPetsByAge(int age);
}

然后在PetServiceImpl里实现这个方法:

@Service
public class PetServiceImpl implements PetService {
    private PetRepository petrepository;

    public PetServiceImpl(PetRepository petrepository) {
        this.petrepository = petrepository;
    }

    // ... 你已有的getAllPets和getPetById方法

    @Override
    public List<Pet> getPetsByAge(int age) {
        return petrepository.findByAge(age);
    }
}

最后添加Controller接口

在PetsController里新增一个GetMapping接口来接收年龄参数:

// 新增:按年龄查询宠物
@GetMapping("/age/{age}")
public List<Pet> getPetsByAge(@PathVariable("age") int age) {
    return petService.getPetsByAge(age);
}

这样你访问/pets/age/5(假设你的基础路径是/pets)就能得到所有年龄为5的宠物了!

二、自定义查询(适合复杂场景)

如果你的查询逻辑比较复杂(比如多条件组合、排序、聚合等),可以用@Query注解来手写查询语句,支持JPQL(面向实体的查询语言)和原生SQL两种方式:

方式1:JPQL查询(推荐,和实体类绑定,不依赖数据库表结构)

在PetRepository里添加:

public interface PetRepository extends JpaRepository<Pet, Integer> {
    // ... 你已有的方法

    @Query("SELECT p FROM Pet p WHERE p.age = :age")
    List<Pet> findPetsByAge(@Param("age") int age);
}

方式2:原生SQL查询(直接写数据库原生SQL,适合复杂的数据库特定语法)

public interface PetRepository extends JpaRepository<Pet, Integer> {
    // ... 你已有的方法

    @Query(value = "SELECT * FROM pets WHERE age = :age", nativeQuery = true)
    List<Pet> findPetsByAge(@Param("age") int age);
}

两种方式的Service和Controller层实现和上面的方法名查询完全一样,选哪种取决于你的需求:JPQL更通用(换数据库不用改),原生SQL更灵活(支持数据库特有功能)。

补充小提示

  • Spring Data JPA的方法名规则很灵活,比如你还可以写findByAgeGreaterThan(int age)(查询年龄大于指定值的宠物)、findByAgeAndName(int age, String name)(多条件查询)等,它都会自动生成对应的SQL。
  • 如果你的查询可能返回空列表,返回List<Pet>是没问题的;如果是单个结果,可以用Optional<Pet>来避免空指针问题。

内容的提问来源于stack exchange,提问作者craftdeer

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.30 15:17:32