Spring Data JPA выводит запросы на основе соглашений об именах методов. Итак, чтобы получить year
по code
в таблице YearMade
, вам нужно изменить свой YearReporsitory
интерфейс следующим образом (добавить абстрактный метод):
public interface YearRepository extends JpaRepository<Year, Long> {
// set return type as required
//find - Do What, ByCode - Criteria.
public Integer findByCode(String code);
}
И используйте этот метод в ваш YearService
так же, как вы использовали другие методы. Но вы не можете использовать тот же метод для получения бренда по требованию кода. Вам нужно будет написать для него класс репо, например:
public interface BrandRepository extends JpaRepository<CarBrand, Long> {
public Integer findByCode(String code);
}
Вы можете написать эти методы для всех членов вашего класса Entity
. Вы должны следовать соглашению об именах, чтобы Spring распознал его.
EDIT (чтобы показать, как использовать это в контроллере и классе обслуживания):
YearRepository
interface:
public interface YearRepository extends JpaRepository<Year, Long> {
// set return type as required
//find - Do What, ByCode - Criteria.
public Integer findByCode(String code);
}
BrandRepository
public interface BrandRepository extends JpaRepository<Brand, Long> {
/*The below two methods are abstract methods.*/
// it must follow the findby<MemberName> convention
//return CarBrand
CarBrand findByBrand(String brand);
/*return a CarBrand Entity*/
public CarBrand findByCode(String code);
YearService
:
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 int getYearByCode(String code) {
//here, we're using this method just as you've used the methods above.
//Spring constructs the query at runtime
return yearRepository.findByCode(code); //<-- usage of the custom method
}
}
BService
:
public interface BService {
CarBrand findVehicleBrand(String name);
}
BrandService
:
@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 CarBrand findVehicleBrand(String name) {
//var brand = (List<Brand>) brandRepository.findVehicleBrand(name);
var brand = brandRepository.findByBrand(name); //<-- using the custom method in brandRepository
return brand;
}
}
Ваш RepsonseDto
:
class RepsonseDto {
private String yearMade;
private brandName;
//getters and setters
/*Use @JsonProperty("Year Made") and @JsonProperty("Brand Name") on your getters. Otherwise, you will get json reposnse as: "yearMade" and "brandName"*/
}
Контроллер:
Есть более эффективные способы написания контроллеров и внедрения зависимостей. Давайте сохраним пока это просто.
@RequestController
class YourController {
//inject dependencies
@Autowired
YearService yearService;
@Autowired
BrandService brandService;
@RequestMapping("/{vincode}")
// the definition for ResponseEntity is above
public ResponseEntity<RepsonseDto> getAttr(@PathVariable(value="vincode") String vincode) {
// create a ReponseEntity object
RepsonseDto retEntity = new RepsonseDto();
// do a check for null and expected length of vincode
if(vincode != null && vincode.length() == 5) {
String yr = vincode.substring(0,1);
String brand = vincode.substring(2,4);
retEntity.setYearMade(yearService.getYearByCode(yr));
retEntity.setBrandName(brandService.findVehicleBrand(brand));
System.out.println(yr);
}
return new ResponseEntity<>(retEntity, HttpStatus.OK)
}
ПРИМЕЧАНИЕ : Я не использовал IDE, чтобы написать это. Могут быть ошибки компилятора. Надеюсь, это даст вам представление обо всем этом.