jpa를 사용하여 동일한 테이블의 mariadb를 선택하십시오.
같은 테이블의 조작으로 테이블에서 삭제가 필요합니다.JPA 쿼리는
DELETE FROM com.model.ElectricityLedgerEntity a
Where a.elLedgerid IN
(SELECT P.elLedgerid FROM
(SELECT MAX(b.elLedgerid)
FROM com.model.ElectricityLedgerEntity b
WHERE b.accountId='24' and b.ledgerType='Electricity Ledger' and b.postType='ARREARS') P );
다음 오류가 발생하였습니다.
근본 원인 org.intermate를 지정합니다.hql.ast.QuerySyntaxException: 예기치 않은 토큰: (줄 1, 열 109 [DELETE FROM com.bcits.bfm.model])전기LedgerEntity a Where a.elGerid IN (SELECT P.elGerid FROM) (SELECT MAX (b.elGerid) FROM).전기LedgerEntity b WHERE b.accountId='24' 및 b.199Type='전기 대장' 및 b.postType='org.hibernate의 P ) ]를 참조해 주세요.hql.ast.org.hibernate에서 QuerySyntaxException.convert(QuerySyntaxException.java:54)를 실행합니다.hql.ast.org.hibernate에서 QuerySyntaxException.convert(QuerySyntaxException.java:47).hql.ast.에러 카운터srowQueryException(ErrorCounter.java:82)을 org.hibernate로 설정합니다.hql.ast.QueryTranslatorImpl.parse(QueryTranslatorImpl.java:284)
mysql 터미널에서도 같은 쿼리가 실행되고 있지만 jpa에서는 동작하지 않습니다.jpa를 사용하여 이 쿼리를 작성하는 방법을 가르쳐 주실 수 있습니까?
왜 이런 걸 쓰는지 모르겠어요.P
마지막 괄호 앞에...
다음 코드는 충분하지 않습니다.
DELETE FROM com.model.ElectricityLedgerEntity a
Where a.elLedgerid IN
(SELECT MAX(b.elLedgerid)
FROM com.model.ElectricityLedgerEntity b
WHERE b.accountId='24' and b.ledgerType='Electricity Ledger' and
b.postType='ARREARS')
mysql 서브쿼리 제한을 바이패스하기 위한 편집:
새로운 에러java.sql.SQLException: You can't specify target table 'LEDGER' for update in FROM clause
는 JPA와 함께 사용하면 mysql에 표시됩니다.MySQL 제한 사항 중 하나입니다.이에 대한 최근 stackoverflow 질문
즉, 에서 쿼리한 테이블은 직접 갱신/삭제할 수 없습니다.select
조문
원래 쿼리가 mysql에 도움이 되는 것처럼 보이는 여러 개의 서브쿼리를 실행하고 "특수한" 구문을 가진 이유를 알게 되었습니다.JPA에서 이 문제를 해결하기 위한 요령을 모릅니다(MySQL DBMS를 오랫동안 사용하지 않습니다).
당신 집에서는 두 가지 질문을 하겠습니다.첫 번째는 예상되는 최대 elLedgerid를 선택하고 두 번째는 이전 쿼리에서 취득한ID를 가진 행을 삭제할 수 있는 것입니다.SQL 모델이 적절하게 설계되어 있고 SQL 인덱스가 올바르게 배치되어 있으며 데이터베이스에 액세스하는 시간이 정확하다면 성능 문제가 발생하지 않아야 합니다.
휴지 상태에서는 단일 쿼리로 이 작업을 수행할 수 없습니다.휴지 상태에서의 최대 행을 삭제하려면 , 2개의 순서로 삭제할 필요가 있습니다.첫 번째로 max 엔트리를 찾은 후 그 값을 사용하여 삭제할 수 있습니다.WHERE
절을 클릭합니다.
그러나 작성한 쿼리는 실제로 원시 MySQL 쿼리로 실행되어야 합니다.이 쿼리를 원시 쿼리로 실행해 보십시오.
String sql = "DELETE FROM com.model.ElectricityLedgerEntity a " +
"WHERE a.elLedgerid IN (SELECT P.elLedgerid FROM " +
"(SELECT MAX(b.elLedgerid) FROM com.model.ElectricityLedgerEntity b " +
"WHERE b.accountId = :account_id AND b.ledgerType = :ledger_type AND " +
" b.postType = :post_type) P );";
Query query = session.createSQLQuery(sql);
query.setParameter("account_id", "24");
query.setParameter("ledger_type", "Electricity Ledger");
query.setParameter("post_type", "ARREARS");
즉, select 절에서 조회한 테이블을 "직접" 갱신/삭제할 수 없습니다.
이는 MariaDB 10.3.1부터 시작되었습니다.
MariaDB 10.3.1 이전에는 동일한 소스 및 타깃을 가진 테이블에서 삭제할 수 없었습니다.이것은 MariaDB 10.3.1부터 가능합니다.예를 들어 다음과 같습니다.
DELETE FROM t1 WHERE c1 IN (SELECT b.c1 FROM t1 b WHERE b.c2=0);
언급URL : https://stackoverflow.com/questions/38538557/delete-from-table-on-same-select-same-table-mariadb-using-jpa
'programing' 카테고리의 다른 글
테이블의 열을 카운트하려면 어떻게 해야 합니까? (0) | 2022.10.28 |
---|---|
Vue CLI 유닛 테스트(단일 테스트 실행 방법) (0) | 2022.10.28 |
많은 '그렇지 않은 경우' 문장을 보다 깔끔한 접근법으로 변환 (0) | 2022.10.28 |
리스트 내 객체의 특정 필드의 합계 값 (0) | 2022.10.18 |
날짜를 타임스탬프로 변환하는 방법 (0) | 2022.10.18 |