#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