【问题标题】:Spring Data JPA Unable to locate Attribute with the given nameSpring Data JPA 无法找到具有给定名称的属性
【发布时间】:2018-08-25 10:41:35
【问题描述】:

我试图在Spring Boot 上使用Spring Data JPA,但一直出错,我不知道问题出在哪里:

无法找到具有给定名称 [firstName] 的属性 这个 ManagedType [com.example.h2demo.domain.Subscriber]

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;
          }
        }
...

我的存储库类

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

}

【问题讨论】:

    标签: java spring-boot spring-data-jpa h2


    【解决方案1】:

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

    它应该可以工作。

    SubscriberRepository 中的findByFirstName 按照惯例尝试查找不存在的字段firstName

    关于实体内部属性如何遍历的进一步参考https://docs.spring.io/spring-data/jpa/docs/current/reference/html/#repositories.query-methods.query-property-expressions

    【讨论】:

    • 我可以再问一个问题吗?将 JSON POST 发送到 addSubscriber 方法会将空值存储到数据库。代码有错误吗??
    • 在调用addSubscriber之前尝试检查值
    • 在我看来,接受的答案应该建议以一般方式识别问题的方法;这个答案只是调试这个特定的代码:soft of pair-programming
    【解决方案2】:

    同样的问题是当我处理 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)
    }
    

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

        根据specification ,属性名称应以小写开头。

        ...解析算法首先将整个部分 (AddressZipCode) 解释为属性,然后检查域类以查找具有该名称的属性(未大写)...

        它将尝试查找名称未大写的属性。所以用firstName代替FristName等等。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-07-15
          • 1970-01-01
          • 2020-08-19
          • 1970-01-01
          相关资源
          最近更新 更多