如何向我的spring boot应用程序添加自定义查询并在控制器中访问它?
我有两个名为Carbrand
和Yearmade
的表。 carbrand
将id
,code
和brand
作为列。 yearmade
也有id
,code
和year
作为列。
我已经用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;
}
在哪里添加查询以及如何在控制器中使用它?
谢谢。
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}”)可能更有用
没有必要使用子字符串,也许代码或公司密钥大小的变化。
服务层也可以随时注入和使用。