我试图在Spring Data JPA
上使用Spring Boot
并且我一直收到错误,我无法弄清问题是什么:
无法找到具有给定名称[firstName]的属性 此ManagedType [com.example.h2demo.domain.Subscriber]
FirstName在我的实体类中声明。我之前使用过带有DAO的服务类和不同的项目并且工作得很好。
My Entity类(getter和setter也在类中):
@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);
}
}
我的控制器类:
@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";
}
}
答案 0 :(得分:10)
尝试将private String FirstName,LastName,Email;
更改为private String firstName,lastName,email;
它应该有用。
findByFirstName
中的{p> SubscriberRepository
会按照约定尝试查找字段firstName
。
答案 1 :(得分:2)
根据specification,属性名称应以小写字母开头。
...解析算法首先将整个部分(AddressZipCode)解释为属性,并检查域类中是否有具有该名称的属性(未大写)....
它会尝试找到一个名为uncapitalized的属性。因此,请使用firstName
代替FristName
等等。
答案 2 :(得分:0)
将entity class
变量从大写字母更改为小写字母(例如,Username
到username
之后,方法Users findByUsername(String username);
现在对我有用。
答案 3 :(得分:0)
同一个问题是当我处理Spring Data Specification(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)
}