programing

MySQL 교차 결합 쿼리에서 최대 절전 모드 예외

cafebook 2023. 9. 15. 21:20
반응형

MySQL 교차 결합 쿼리에서 최대 절전 모드 예외

다른 클래스인 FeaturesMetadata와 양방향의 ManyToOne 관계가 있는 Features 개체를 대량 삭제하려고 합니다.SQL Grammer를 사용하고 있습니다.예외가 발생했습니다.

사용 중인 hql:

String hql = "delete from Feature F where F.featuresMetadata.stateGeoId = :stateGeoId";

show SQL을 켜면 다음이 생성됩니다.

 delete from FEATURE cross join FEATURESMETADATA featuresme1_ where STATEGEOID=?

SQL을 db 클라이언트에서 직접 실행하면 다음과 같은 예외가 발생합니다.

 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'cross join FEATURESMETADATA featuresme1_ where stategeoid='01'' at line 1

생성된 SQL이 Exception을 던지고 있기 때문에 MySQL5InnoDBDialect에서 MySQLInnoDBDialect로 방언 변경을 시도했지만 변경되지 않았습니다.

누가 도와줄 수 있습니까?

이러한 HQL 쿼리에 조인이 없을 수 있습니다.참고 문서에서 인용한 내용:

암시적이든 명시적이든 어떤 조인도 대량 HQL 쿼리에서 지정할 수 없습니다.하위 쿼리는 하위 쿼리 자체에 조인이 포함될 수 있는 where-clause에서 사용할 수 있습니다.

그래서 저는 이와 같은 것이 효과가 있어야 한다고 생각합니다.

delete from Feature F where F.id in 
    (select f2.id from Feature f2 where f2.featuresMetadata.stateGeoId = :stateGeoId)

저도 같은 문제를 가지고 있었고 합리적인 답을 찾기 위해 애를 먹었습니다.이 접근 방식을 사용하더라도 생성된 SQL은 (읽은 내용에 따르면) 매우 비효율적인 것 같습니다.

그래서 저는 한 걸음 뒤로 물러서서 다음과 같이 했습니다.

    List<Properties> props = propDao.findPropertiesByHotelCode(hotel.getCode());
    propDao.deleteInBatch(props);
    propDao.flush();

기본적으로 '어디서 삭제'를 시도하는 것보다는, 어디서 선택한 다음 내가 검색한 세트를 일괄적으로 삭제하는 것입니다.

도움이 되길 바랍니다.

이것은 정말로 동면 상태 때문에 가난합니다.하지만 레포에서 이렇게 풀 수 있습니다. (적어도 포스트그레에서는)SQL, MySql에 대해 이 구문을 수정해야 하는지 확실하지 않음)

@Modifying
@Query(nativeQuery = true, value = """
    DELETE FROM feature f
    USING features_metadata fd
    WHERE f.features_metadata_id = fd.id AND fd.state_geo_id = :stateGeoId
    """)
void deleteByStateGeoIdId(@Param("stateGeoId") UUID stateGeoId);

언급URL : https://stackoverflow.com/questions/7246563/hibernate-exception-on-mysql-cross-join-query

반응형