私はSpring Data JPA
on Spring Boot
と私はエラーを取得し続けた、私は問題が何であるかを理解することはできません:
このManagedType [com.example.h2demo.domain.Subscriber]で指定された名前[firstName]の属性を見つけることができません
FirstNameは、エンティティクラスで宣言されています。以前に別のプロジェクトでDAOでサービスクラスを使用し、完全に機能しました。
My Entityクラス(ゲッターとセッターもクラスにあります):
@Entity
public class Subscriber {
@Id @GeneratedValue
private long id;
private String FirstName,LastName,Email;
public Subscriber(long id, String firstName, String lastName, String email) {
this.id = id;
this.FirstName = firstName;
this.LastName = lastName;
this.Email = email;
}
}
...
私のリポジトリクラス
@Component
public interface SubscriberRepository extends JpaRepository<Subscriber,Long> {
Subscriber findByFirstName(String FirstName);
Subscriber deleteAllByFirstName(String FirstName);
}
私のサービスクラス
@Service
public class SubscriberService {
@Autowired
private SubscriberRepository subscriberRepository;
public Subscriber findByFirstName(String name){
return subscriberRepository.findByFirstName(name);
}
public Subscriber deleteAllByFirstName(String name){
return subscriberRepository.deleteAllByFirstName(name);
}
public void addSubscriber(Subscriber student) {
subscriberRepository.save(student);
}
}
そして、My Controllerクラス:
@RestController
@RequestMapping("/subscribers")
public class SubscriberController {
@Autowired
private SubscriberService subscriberService;
@GetMapping(value = "/{name}")
public Subscriber findByFirstName(@PathVariable("name") String fname){
return subscriberService.findByFirstName(fname);
}
@PostMapping( value = "/add")
public String insertStudent(@RequestBody final Subscriber subscriber){
subscriberService.addSubscriber(subscriber);
return "Done";
}
}
private String FirstName,LastName,Email;
をprivate String firstName,lastName,email;
に変更してみてください
動作するはずです。
findByFirstName
のSubscriberRepository
は、存在しない慣例によりフィールドfirstName
を見つけようとします。
specification に従って、プロパティ名は小文字で始める必要があります。
...解決アルゴリズムは、パーツ全体(AddressZipCode)をプロパティとして解釈することから始まり、その名前(大文字ではない)のプロパティのドメインクラスをチェックします。
大文字ではない名前のプロパティを見つけようとします。したがって、firstName
などの代わりにFristName
などを使用します。
同じ問題は、Spring Data Specifications( https://www.baeldung.com/rest-api-search-language-spring-data-specifications )を扱ったときでした
最初のコードは:
private Specification<Project> checkCriteriaByProjectNumberLike(projectNumber: String) {
(root, query, criteriaBuilder) -> criteriaBuilder.like(root.get("project_number"), "%" + projectNumber)
}
問題はroot.get( "project_number")にありました。メソッド内では、モデル(projectNumber)のようにフィールド名を入力する必要がありましたが、データベース(project_number)のようにフィールド名を送信しました。
つまり、最終的な正しい決定は次のとおりでした。
private Specification<Project> checkCriteriaByProjectNumberLike(projectNumber: String) {
(root, query, criteriaBuilder) -> criteriaBuilder.like(root.get("projectNumber"), "%" + projectNumber)
}
_entity class
_変数を大文字から小文字に変更した後、たとえばUsername
からusername
にメソッドUsers findByUsername(String username);
が機能します。