Свойство SpringBoot JPA не найдено

#spring-boot #spring-data-jpa #entity

#spring-boot #spring-data-jpa #сущность

Вопрос:

Я обнаруживаю эту ошибку при запуске приложения, я не понимаю, почему .. я нашел информацию в Интернете, но не могу понять, что не так. Спасибо за помощь.

2) Еще один вопрос по этому поводу, должен ли я задать :

 List<HistoriqueDeploiement> findByIdNamespaceAndIdService(Namespace id_namespace, Service id_service);
Or
List<HistoriqueDeploiement> findByIdNamespaceAndIdService(Integer id_namespace, Integer id_service);
  

Ошибка :

 Error creating bean with name 'checkConfigDeploiementRepository': FactoryBean threw exception on object creation; nested exception is java.lang.IllegalArgumentException: Failed to create query for method public abstract java.util.List com.example.jpa.repository.CheckConfigDeploiementRepository.findByIdNamespaceAndIdService(com.example.jpa.model.Namespace,com.example.jpa.model.Service)! No property namespace found for type Integer! Traversed path: CheckConfigDeploiement.id.
  

Сущность :

 @Entity
@Table(name = "historiquedeploiement")
@Data
@EqualsAndHashCode(callSuper=false)
@NoArgsConstructor
@AllArgsConstructor
public class HistoriqueDeploiement extends AuditModel {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name="id", nullable=false, unique=true)
    private Integer id;    

    @ManyToOne(fetch = FetchType.LAZY, optional = false)
    @JoinColumn(name = "id_namespace", nullable = false)    
    @JsonIdentityInfo(generator=ObjectIdGenerators.PropertyGenerator.class, property="id")
    @JsonIdentityReference(alwaysAsId=true)
    @JsonProperty("id_namespace")
    private Namespace namespace;

    @ManyToOne(fetch = FetchType.LAZY, optional = false)
    @JoinColumn(name = "id_service", nullable = false)    
    @JsonIdentityInfo(generator=ObjectIdGenerators.PropertyGenerator.class, property="id")
    @JsonIdentityReference(alwaysAsId=true)
    @JsonProperty("id_service")
    private Service service;

    @NotEmpty(message = "Le GitCommit ne peut être vide")
    @Size(max = 255)
    private String gitCommit;   
    
    @NotEmpty(message = "Le TagVersion ne peut être vide")
    @Size(max = 100)
    private String tagVersion;  
    
    @NotEmpty(message = "Le Actionby ne peut être vide")
    @Size(max = 255)
    private String actionBy;    
    
}
  

NamespaceEntity (то же самое с service ..)

 @Entity
@Table(name = "namespace")
@Data
@EqualsAndHashCode(callSuper=false)
@NoArgsConstructor
@AllArgsConstructor
public class Namespace extends AuditModel {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name="id", nullable=false, unique=true)
    private Integer id;

    @NotEmpty
    @Size(max = 100)
    @Column(unique = true)
    private String namespace;

    @OneToMany(mappedBy = "namespace", cascade = CascadeType.ALL, orphanRemoval = true)  
    private List<HistoriqueDeploiement> historiquedeploiements = new ArrayList<>();

    public void addHistoriqueDeploiement(HistoriqueDeploiement historiquedeploiement) {
        historiquedeploiements.add(historiquedeploiement);
        historiquedeploiement.setNamespace(this);
    }

    public void removeHistoriqueDeploiement(HistoriqueDeploiement historiquedeploiement) {
        historiquedeploiements.remove(historiquedeploiement);
        historiquedeploiement.setNamespace(null);
    }
}
  

Репозиторий, я не понимаю, что я делаю не так :

 ...
@Repository
public interface HistoriqueDeploiementRepository extends JpaRepository<HistoriqueDeploiement, Integer> {        
    List<HistoriqueDeploiement> findAll();
    
    List<HistoriqueDeploiement> findByIdNamespace(Integer id);
    
    List<HistoriqueDeploiement> findByIdNamespaceAndIdService(Namespace id_namespace, Service id_service);
    
    List<HistoriqueDeploiement> findByIdNamespaceAndLogCreatedAtBetween(Namespace id_namespace, Date datedebut, Date datefin);

    List<HistoriqueDeploiement> findByIdNamespaceAndLogCreatedAt(Namespace id_namespace, Date date);

}
  

Комментарии:

1. Не могли бы вы, пожалуйста, написать SQL-запрос, который вы хотели бы, чтобы метод репозитория выполнил? А именно, мне кажется, что вам нужен список объектов HistoriqueDeploiement, так что связанные пространства имен и службы имеют некоторые свойства. Если это действительно так, то вам нужны некоторые объединения, и маловероятно, что вы сможете это сделать с помощью Spring Data DSL

2. Я использую сопоставление и DTO, чтобы получить нужное мне значение (я понимаю, что вы говорите). Но на самом деле проблема в моем репозитории: (

Ответ №1:

Итак, я рассмотрел вашу проблему, и вот что я нашел. Типы, которые вы назначили параметрам метода интерфейса репозитория, неверны.

Вы хотите получить список объектов HistoriqueDeploiement, чьи объекты пространства имен и службы имеют определенные идентификаторы. Обратите внимание, что идентификаторы объектов пространства имен и служб являются целочисленными типами. Итак, чтобы решить проблему, вы можете просто переписать свои методы следующим образом:

 @Repository
public interface HistoriqueDeploiementRepository extends 
JpaRepository<HistoriqueDeploiement, Integer> {        
    List<HistoriqueDeploiement> findAll();

    List<HistoriqueDeploiement> findByNamespaceId(Integer id);

    List<HistoriqueDeploiement> findByNamespaceIdAndServiceId(Integer id_namespace, Integer id_service);

    List<HistoriqueDeploiement> findByNamespaceIdAndLogCreatedAtBetween(Integer id_namespace, Date datedebut, Date datefin);

    List<HistoriqueDeploiement> findByNamespaceIdAndLogCreatedAt(Integer id_namespace, Date date);
}
  

Обратите внимание, что основным изменением здесь является то, что мы заменили типы пространств имен и служб целочисленным типом, который является фактическим типом их идентификаторов

Комментарии:

1. Это был мой первый тест, но с этим у меня : No property namespace found for type Integer

2. К сожалению, я забыл внести изменения в имена методов, а только в параметры. Я отредактировал свой ответ, и теперь он должен работать

3. Приложение работает с этим, но я не понимаю, почему NamespaceId , а не IdNamespace?? Спасибо!

4. Если бы у вас был экземпляр пространства имен с именем namespace, как бы вы получили доступ к его атрибуту id ? Вы бы использовали namespace.getId() , но поскольку имена методов не могут содержать точек и фигурных скобок, то соглашение заключалось в том, чтобы записать его как NamespaceId