programing

jpa를 사용하여 동일한 테이블의 mariadb를 선택하십시오.

sourcetip 2022. 10. 28. 23:00
반응형

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

반응형