Spring MVC 无法执行语句; SQL [n/a] Caused by - Unknown column 'postback_data' in 'field list'

9njqaruj  于 8个月前  发布在  Spring
关注(0)|答案(1)|浏览(65)

我目前正在工作的要求之一,我想在我的数据库中发布一些数据。
在我名为template_data的数据库中,我有三个列,名为idjson_datatimestamp。json_data列将保存json,其中json值将来自用户,例如:

"suggestions": [
            {
                "reply": {
                    "text": "**Tobe given by user**",
                    "postbackData": "**Tobe given by user**"
                }
            }

我必须通过我的代码来构造这个JSON,我在下面的代码中所做的就是这样。

package com.airkommtemplate.springboot.RCMTemplate.controller;

import com.airkommtemplate.springboot.RCMTemplate.entity.TemplateData;
import com.airkommtemplate.springboot.RCMTemplate.service.TemplateServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;

import java.time.LocalDateTime;
import java.util.List;

@Controller
@RequestMapping("/templates")
public class TemplateController {

    private TemplateServiceImpl templateService;

    @Autowired
    public  TemplateController(TemplateServiceImpl theTemplateService){
        templateService = theTemplateService;
    }

    @GetMapping("/form")
    public String showForm(Model model) {
        model.addAttribute("template", new TemplateData());
        return "templates/template-form"; // Thymeleaf template file name (e.g., template-form.html)
    }

    @GetMapping("/list")
    public String listTemplateData(Model theModel) {

        List<TemplateData> theTemplateList =templateService.findAll();

        // add to the spring model
        theModel.addAttribute("templates", theTemplateList);

        return "templates/list-templates";
    }

    @PostMapping("/save")
    public String saveData(@ModelAttribute("template") TemplateData template) {
        // Construct the complete JSON structure using user input
        String jsonData = "{\"suggestions\": [{" +
                "\"reply\": {" +
                "\"text\": \"" + template.getText() + "\"," +
                "\"postbackData\": \"" + template.getPostbackData() + "\"" +
                "}}]}";

        // Set timestamp
        template.setTimestamp(LocalDateTime.now());
        // Save the complete JSON data to the database
        template.setJsonData(jsonData);

        templateService.saveData(template);

        return "redirect:/templates/list";

        //return "redirect:/success"; // Redirect to a success page
    }
}
  • 服务 *
package com.airkommtemplate.springboot.RCMTemplate.service;

import com.airkommtemplate.springboot.RCMTemplate.dao.TemplateDataRepository;
import com.airkommtemplate.springboot.RCMTemplate.entity.TemplateData;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.time.LocalDateTime;
import java.util.List;

@Service
public class TemplateServiceImpl implements TemplateService{

    private final TemplateDataRepository templateDataRepository;

    @Autowired
    public TemplateServiceImpl(TemplateDataRepository templateDataRepository) {
        this.templateDataRepository = templateDataRepository;
    }
    @Override
    public List<TemplateData> findAll() {
        return templateDataRepository.findAll();
    }

    @Override
    public void saveData(TemplateData templateData) {
        //TemplateData templateData = new TemplateData();
        templateData.setTimestamp(LocalDateTime.now());
        templateDataRepository.save(templateData);

    }


}

存储库(DAO)

package com.airkommtemplate.springboot.RCMTemplate.dao;

import com.airkommtemplate.springboot.RCMTemplate.entity.TemplateData;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;

@Repository
public interface TemplateDataRepository extends JpaRepository<TemplateData, Integer> {
}

我的实体类持有以下参数

@Entity
@Table(name="template_data")
public class TemplateData {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name="id")
    private int id;

    @Column(name="json_data")
    private String jsonData;

    @Column(name="timestamp")
    private LocalDateTime timestamp;

    private String text;
    private String postbackData;

当我尝试使用**/templates/保存**API保存此数据时,它会抛出以下错误:

There was an unexpected error (type=Internal Server Error, status=500).
could not execute statement; SQL [n/a]
org.springframework.dao.InvalidDataAccessResourceUsageException: could not execute statement; SQL [n/a]
    at org.springframework.orm.jpa.vendor.HibernateJpaDialect.convertHibernateAccessException(HibernateJpaDialect.java:256)
    at org.springframework.orm.jpa.vendor.HibernateJpaDialect.translateExceptionIfPossible(HibernateJpaDialect.java:232)
    at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.translateExceptionIfPossible(AbstractEntityManagerFactoryBean.java:550)
    at org.springframework.dao.support.ChainedPersistenceExceptionTranslator.translateExceptionIfPossible(ChainedPersistenceExceptionTranslator.java:61)
    at org.springframework.dao.support.DataAccessUtils.translateIfNecessary(DataAccessUtils.java:243)
    at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:152)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184)
    at org.springframework.data.jpa.repository.support.CrudMethodMetadataPostProcessor$CrudMethodMetadataPopulatingMethodInterceptor.invoke(CrudMethodMetadataPostProcessor.java:164)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184)
    at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:97)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184)
    at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:244)
    at jdk.proxy4/jdk.proxy4.$Proxy111.save(Unknown Source)
    at com.airkommtemplate.springboot.RCMTemplate.service.TemplateServiceImpl.saveData(TemplateServiceImpl.java:29)
    at com.airkommtemplate.springboot.RCMTemplate.controller.TemplateController.saveData(TemplateController.java:59).......

Caused by: java.sql.SQLSyntaxErrorException: Unknown column 'postback_data' in 'field list'
    at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:121)
    at com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:122......

我已经尝试改变参数的模板类型,我在我的控制器传递到服务调用,但没有工作了。没有工作在这里,帮助将不胜感激。
谢谢.

pcrecxhr

pcrecxhr1#

请记住
Java的transient关键字用于表示字段不被序列化,而JPA的@Transient注解用于表示字段不被持久化在数据库中,即它们的语义不同。
因此,请进行以下更改

@Transient
    private String text;

    @Transient
    private String postbackData;

如果答案有效,请接受,谢谢!

相关问题