Spring Data JPA无法使用给定名称定位Attribute

smn*_*ned 8 java h2 spring-data-jpa spring-boot

我试图用Spring Data JPASpring Boot和我一直得到错误,我想不通的问题是什么:

无法在此ManagedType [com.example.h2demo.domain.Subscriber]上找到具有给定名称[firstName]的Attribute

FirstName在我的实体类中声明.我之前使用过DAO服务类和不同的项目并且工作得很好.

我的实体类(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;
          }
        }
...
Run Code Online (Sandbox Code Playgroud)

我的存储库类

@Component
public interface SubscriberRepository extends JpaRepository<Subscriber,Long> {
    Subscriber findByFirstName(String FirstName);
    Subscriber deleteAllByFirstName(String FirstName);
}
Run Code Online (Sandbox Code Playgroud)

我的服务类

@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);
    }
}
Run Code Online (Sandbox Code Playgroud)

和我的控制器类:

@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";
    }

}
Run Code Online (Sandbox Code Playgroud)

har*_*rsh 11

尝试private String FirstName,LastName,Email;改为private String firstName,lastName,email;

它应该工作.

findByFirstNameSubscriberRepository试图找到一个场firstName按照惯例是不存在的.


S.D*_*eko 8

同样的问题是当我处理 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)
}
Run Code Online (Sandbox Code Playgroud)

问题出在 root.get("project_number") 中。在方法内部,我必须将字段名称放在模型中 (projectNumber),但我发送的字段名称和数据库中一样 (project_number)。

也就是说,最终正确的决定是:

private Specification<Project> checkCriteriaByProjectNumberLike(projectNumber: String) {
    (root, query, criteriaBuilder) -> criteriaBuilder.like(root.get("projectNumber"), "%" + projectNumber)
}
Run Code Online (Sandbox Code Playgroud)


Osa*_*nna 7

例如,在我将entity class变量从大写字母更改为小写字母之后Username,该username方法Users findByUsername(String username);现在对我有用。


JPS*_*JPS 6

根据规范,属性名称应以小写字母开头。

[...]解析算法首先将整个部分 ( AddressZipCode) 解释为属性,并检查域类中是否有具有该名称(非大写)的属性[...]。

它将尝试查找名称未大写的属性。所以使用firstName而不是FirstNameand 等等。