У меня проблема, когда я хочу удалить из таблицы ассоциации, которая имеет составной ключ и дополнительный столбец.
таблица ассоциации представлена объектом, который имеет два объекта, Collaborator и Компетенция , с отношением @ ManyToOne . С другой стороны, у меня есть отношение @ OneToMany с CollaboratorCompetence Сущность , которая имеет составной ключ (laborator_id , компетенция_ид).
Когда я выполняю этот запрос , чтобы удалить строку в таблицеlaborators_competences, он работает.
Запрос 1
DELETE FROM collaborators_competences WHERE (collaborator_id, competence_id)
IN (SELECT collaborator_id, competence_id FROM collaborators_competences
JOIN collaborators c on collaborators_competences.collaborator_id = c.id
JOIN competences c2 on collaborators_competences.competence_id = c2.id
WHERE c.id = (SELECT collaborators.id FROM collaborators WHERE login = :collabLogin) AND c2.id = :competenceId)
Запрос 2 (упрощенный)
DELETE FROM collaborators_competences cc WHERE cc.collaborator_id = (SELECT collaborators.id FROM collaborators WHERE collaborators.login = :collabLogin)AND cc.competence_id = :competenceId
Теперь, когда я выполняю тот же запрос с помощью репозитория, я получаю ошибку «Не удалось извлечь Resultset» .
Репозиторий
public interface CollaboratorCompetenceRepository extends JpaRepository<CollaboratorCompetence, CollaboratorCompetenceId> {
Optional<CollaboratorCompetence> findById(CollaboratorCompetenceId id);
// @Query(value = "DELETE FROM CollaboratorCompetence " +
// "WHERE CollaboratorCompetence.collaborator IN (SELECT Collaborator FROM Collaborator WHERE Collaborator.login = :collabLogin)" +
// "AND CollaboratorCompetence.competence IN (SELECT COmpetence FROM Competence WHERE Competence.id = :competenceId)")
// @Query(value = "DELETE FROM collaborators_competences WHERE collaborator_id = 1128 AND competence_id = 2551", nativeQuery = true)
@Query(value = "DELETE FROM collaborators_competences WHERE (collaborator_id, competence_id)\n" +
" IN (SELECT collaborator_id, competence_id FROM collaborators_competences\n" +
" JOIN collaborators c on collaborators_competences.collaborator_id = c.id\n" +
" JOIN competences c2 on collaborators_competences.competence_id = c2.id\n" +
" WHERE c.id = (SELECT collaborators.id FROM collaborators WHERE login = :collabLogin) AND c2.id = :competenceId)", nativeQuery = true)
void deleteByCollaboratorLoginAndCompetenceId(@Param("collabLogin") String login, @Param("competenceId") Long id);
void deleteCollaboratorCompetenceById(CollaboratorCompetenceId id);
}
Даже с данными Spring, Hibernate выполняет только запрос select и без запроса на удаление.
Объект CollaboratorCompetence
@Entity
@Table(name = "collaborators_competences")
public class CollaboratorCompetence {
@EmbeddedId
private CollaboratorCompetenceId id;
@ManyToOne
@MapsId("collaboratorId")
private Collaborator collaborator;
@ManyToOne
@MapsId("competenceId")
private Competence competence;
@Column(name = "note")
private Integer note;
public CollaboratorCompetence() {
}
public CollaboratorCompetence(Collaborator collaborator, Competence competence, Integer note) {
this.id = new CollaboratorCompetenceId(collaborator.getId(), competence.getId());
this.collaborator = collaborator;
this.competence = competence;
this.note = note;
}
CollaboratorCompetenceId (встраиваемый класс)
@Embeddable
public class CollaboratorCompetenceId implements Serializable {
@JoinColumn(name = "competence_id", table = "collaborators_competences")
private Long competenceId;
@JoinColumn(name = "collaborator_id", table = "collaborators_competences")
private Long collaboratorId;
public CollaboratorCompetenceId() {
}
public CollaboratorCompetenceId(Long competenceId, Long collaboratorId) {
this.competenceId = competenceId;
this.collaboratorId = collaboratorId;
}
public Long getCompetenceId() {
return competenceId;
}
public void setCompetenceId(Long competenceId) {
this.competenceId = competenceId;
}
public Long getCollaboratorId() {
return collaboratorId;
}
public void setCollaboratorId(Long collaboratorId) {
this.collaboratorId = collaboratorId;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
CollaboratorCompetenceId that = (CollaboratorCompetenceId) o;
return Objects.equals(competenceId, that.competenceId) &&
Objects.equals(collaboratorId, that.collaboratorId);
}
@Override
public int hashCode() {
return Objects.hash(competenceId, collaboratorId);
}
@Override
public String toString() {
return "CollaboratorCompetenceId{" +
"competenceId=" + competenceId +
", collaboratorId=" + collaboratorId +
'}';
}
}
Стек ошибок:
Caused by: org.hibernate.exception.GenericJDBCException: could not extract ResultSet
at org.hibernate.exception.internal.StandardSQLExceptionConverter.convert(StandardSQLExceptionConverter.java:47)
at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:111)
at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:97)
at org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.extract(ResultSetReturnImpl.java:69)
at org.hibernate.loader.Loader.getResultSet(Loader.java:2168)
at org.hibernate.loader.Loader.executeQueryStatement(Loader.java:1931)
at org.hibernate.loader.Loader.executeQueryStatement(Loader.java:1893)
at org.hibernate.loader.Loader.doQuery(Loader.java:938)
at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:341)
at org.hibernate.loader.Loader.doList(Loader.java:2692)
at org.hibernate.loader.Loader.doList(Loader.java:2675)
at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2507)
at org.hibernate.loader.Loader.list(Loader.java:2502)
at org.hibernate.loader.custom.CustomLoader.list(CustomLoader.java:335)
at org.hibernate.internal.SessionImpl.listCustomQuery(SessionImpl.java:2200)
at org.hibernate.internal.AbstractSharedSessionContract.list(AbstractSharedSessionContract.java:1016)
at org.hibernate.query.internal.NativeQueryImpl.doList(NativeQueryImpl.java:152)
at org.hibernate.query.internal.AbstractProducedQuery.list(AbstractProducedQuery.java:1414)
at org.hibernate.query.internal.AbstractProducedQuery.getSingleResult(AbstractProducedQuery.java:1463)
at org.springframework.data.jpa.repository.query.JpaQueryExecution$SingleEntityExecution.doExecute(JpaQueryExecution.java:214)
at org.springframework.data.jpa.repository.query.JpaQueryExecution.execute(JpaQueryExecution.java:91)
at org.springframework.data.jpa.repository.query.AbstractJpaQuery.doExecute(AbstractJpaQuery.java:136)
at org.springframework.data.jpa.repository.query.AbstractJpaQuery.execute(AbstractJpaQuery.java:125)
at org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.doInvoke(RepositoryFactorySupport.java:602)
at org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.invoke(RepositoryFactorySupport.java:590)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:185)
at org.springframework.data.projection.DefaultMethodInvokingMethodInterceptor.invoke(DefaultMethodInvokingMethodInterceptor.java:59)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:185)
at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:294)
at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:98)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:185)
at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:139)
... 175 common frames omitted
Caused by: org.postgresql.util.PSQLException: Aucun résultat retourné par la requête.
at org.postgresql.jdbc.PgPreparedStatement.executeQuery(PgPreparedStatement.java:107)
at com.zaxxer.hikari.pool.ProxyPreparedStatement.executeQuery(ProxyPreparedStatement.java:52)
at com.zaxxer.hikari.pool.HikariProxyPreparedStatement.executeQuery(HikariProxyPreparedStatement.java)
at org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.extract(ResultSetReturnImpl.java:60)
... 203 common frames omitted