提问者:小点点

控制器中的spring boot自定义查询


如何向我的spring boot应用程序添加自定义查询并在控制器中访问它?

我有两个名为CarbrandYearmade的表。 carbrandidcodebrand作为列。 yearmade也有idcodeyear作为列。

我已经用setter和getter方法为每个实体编写了我的模型类。 我已经添加了我的存储库接口和我的服务类。

public interface YearRepository extends JpaRepository<Year, Long> {
}

我的品牌库

public interface BrandRepository extends JpaRepository<Brand, Long> {

    @Query("select b from brand b where brand.brand = ?1")
    List<Brand> findVehicleBrand(String brand);
}

这是我的服务等级

public class YearService {

@Autowired
private YearRepository yearRepository;

public List<Year> listAll(){
    return yearRepository.findAll();
}

public void save(Year engineSize){
    yearRepository.save(engineSize);
}

public Year get (long id){
    return yearRepository.findById(id).get();
}

public void delete (Long id){
    yearRepository.deleteById(id);
}

我的品牌服务

public interface BService {

    List<Brand> findVehicleBrand(String name);

}

还有这个。

@Service
@Transactional
public class BrandService implements BService{

    @Autowired
    private BrandRepository brandRepository;



    public List<Brand> listAll(){
        return brandRepository.findAll();
    }

    public void save(Brand brand){
        brandRepository.save(brand);
    }

    public Brand get (long id){
        return brandRepository.findById(id).get();
    }

    public void delete (Long id){
        brandRepository.deleteById(id);
    }


    @Override
    public List<Brand> findVehicleBrand(String name) {
        var brand = (List<Brand>) brandRepository.findVehicleBrand(name);
        return brand;
    }
}

在我的控制器中,我得到一个带有字符串的path变量,我使用substring将字符串分成两个。 这两个子字符串有品牌和年份的代码。 前两个代表年份,其他三个代表品牌。 我如何将代码与数据库中的代码进行比较,以得到实际年份和品牌。

http://localhost:8081/vincode/wwqpt

在数据库中,ww是1990年的代码,QPT是本田汽车公司的代码。

我想要一个如下的JSON响应

{
Year Made : 1990,
Brand Name : Honda Motor Company
}

这是我到目前为止的控制器类。

@RequestMapping("/{vincode}")
    public @ResponseBody
    String getAttr(@PathVariable(value="vincode") String vincode) {
        String yr = vincode.substring(0,1);
        String brand = vincode.substring(2,4);
        System.out.println(yr);
        return yr;
    }

在哪里添加查询以及如何在控制器中使用它?

谢谢。


共2个答案

匿名用户

Spring Data JPA基于方法命名约定派生查询。 因此,要通过YearMade表中的code获取Year,您需要修改您的YearReporty接口,如下所示(添加一个抽象方法):

 public interface YearRepository extends JpaRepository<Year, Long> {
          // set return type as required
          //find - Do What, ByCode - Criteria.
        public Integer findByCode(String code);
        }

并且,在YearService中使用此方法,就像使用其他方法一样。 但是,您不能使用相同的方法获得品牌的代码要求。 您必须为它编写一个repo类,如:

   public interface BrandRepository extends JpaRepository<CarBrand, Long> {
            public Integer findByCode(String code);
   }

您可以为实体类的所有成员编写这些方法。 你必须遵循命名惯例才能让spring认出来。

匿名用户

如果您没有将请求映射到类的最前面,则http://localhost:8081/vincode/ww/qpt

RequestMapping(“/vincode/{code}/{company}”)可能更有用

没有必要使用子字符串,也许代码或公司密钥大小的变化。

服务层也可以随时注入和使用。