提问者:小点点

如何从JavaSpringBoot项目中的任何类执行对数据库的本机查询?


我试图删除数据库中的记录时删除表,但它给我以下错误:

Error logging in: Request processing failed; nested exception is javax.persistence.TransactionRequiredException: Executing an update/delete query

我读过几篇文章,甚至在堆栈溢出中有一些问题,这是一个关于错误的问题,但没有一个答案是有效的,我看到的最有帮助的是添加注释@Transactional,我把它放在方法执行表()上,但它给了我同样的错误。,这是我的代码:

package com.ssc.test.cb3.service;

import com.ssc.test.cb3.dto.ReportRequestDTO;
import com.ssc.test.cb3.dto.mapper.ReportRequestMapper;
import com.ssc.test.cb3.repository.ReportRequestRepository;
import java.util.List;
import org.springframework.stereotype.Service;
import com.ssc.test.cb3.model.ReportRequest;
import com.ssc.test.cb3.repository.ReportTableRepository;
import java.util.Map;
import javax.persistence.EntityManager;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.transaction.annotation.Transactional;


/**
 * Class to prepare the services to be dispatched to the database upon request.
 *
 * @author ssc
 */
@Service
@RequiredArgsConstructor
@Slf4j
public class ReportRequestService {

    private final ReportRequestRepository reportRequestRepository;
    private final EntityManager entityManager;
    private final ReportTableRepository reportTableRepository;
    private static String SERVER_LOCATION = "D:\\JavaProjectsNetBeans\\sscb3Test\\src\\main\\resources\\";

    
    /**
     * Function to delete a report from the database
     *
     * @param id from the report request objet to identify what is the specific
     * report
     */
    public void delete(int id) {

        ReportRequest reportRequest = reportRequestRepository.findById(id).orElse(null);
        ReportTable reportTable = 
        String fileName = reportRequest.getFileName();
        if (reportRequest == null || reportRequest.getStatus() == 1) {
            log.error("It was not possible to delete the selected report as it hasn't been processed yet or it was not found");
        } else {
            reportRequestRepository.deleteById(id);
            log.info("The report request {} was successfully deleted", id);
            new File(SERVER_LOCATION + reportRequest.getFileName()).delete(); // Delete file
            log.info("The file {} was successfully deleted from the server", fileName);
            // DROP created tables with file name without extention
            executeDropTable(fileName);
            log.info("The table {} was successfully deleted from the data base", fileName);
            

        }
    }

    /**
     * Service to Drop report request tables created on the database when a
     * report request is generated and serviced to be downloaded This method
     * will be called when a user deletes in the fron-end a report request in
     * finished status.
     *
     * @param tableName will be the name of the table that was created on the
     * database
     */
    @Transactional
    public void executeDropTable(String tableName) {
        int substract = 4;
        tableName = tableName.substring(0, tableName.length() - substract);
        System.out.println("Table name: " + tableName);

        String query = "DROP TABLE :tableName"; // IF EXISTS
        entityManager.createNativeQuery(query)
                .setParameter("tableName", tableName)
                .executeUpdate();
    }

}

有人能帮我解决这个问题吗?


共1个答案

匿名用户

本机查询的字面意思是“在数据库上执行这个SQL语句”,但是您正在尝试使用JPL或其他具有变量扩展的东西。

您的SQL字符串无效,请尝试:

String query = "DROP TABLE " + tablename;

entityManager.executeNativeQuery(query);