【问题标题】:how to write long mysql queries in spring mvc in Dao layer如何在 Dao 层的 spring mvc 中编写长 mysql 查询
【发布时间】:2022-01-19 09:19:22
【问题描述】:

所以我一直在尝试在我的 spring mvc 项目中实现一个 sql 查询来将数据插入到数据库中。该查询在 mysql 工作台中运行。但是当我在 Spring 项目的 DAO 层中编写相同的查询时,它给了我一个错误。 我得到的错误如下

org.springframework.jdbc.BadSqlGrammarException: PreparedStatementCallback; bad SQL grammar 
[insert into question (question_id,questions,question_text,user_id) SELECT(?,?,?,?) from user 'where user_id ='2]; nested exception is java.sql.SQLSyntaxErrorException: 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 ''where user_id ='2' at line 1
at org.springframework.jdbc.support.SQLErrorCodeSQLExceptionTranslator.doTranslate(SQLErrorCodeSQLExceptionTranslator.java:239)
at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:70)
at org.springframework.jdbc.core.JdbcTemplate.translateException(JdbcTemplate.java:1541)
at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:667)
at org.springframework.jdbc.core.JdbcTemplate.update(JdbcTemplate.java:960)
at org.springframework.jdbc.core.JdbcTemplate.update(JdbcTemplate.java:1015)
at org.springframework.jdbc.core.JdbcTemplate.update(JdbcTemplate.java:1025)
at qnaapp.dao.UserDaoImpl.question(UserDaoImpl.java:44)
at qnaapp.service.UserServiceImpl.question(UserServiceImpl.java:27)
at qnaapp.UserServiceTest1.testQuestion(UserServiceTest1.java:45)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

这里是建表查询文本文件的链接 https://drive.google.com/file/d/1C966vW9GNs9MFtEheCr2dhs8rztAROaw/view?usp=sharing

这是DAO层的部分代码

 public int question(Question question) {
        String sql = "insert into question (question_id,questions,question_text,user_id) 
 SELECT(?,?,?,?) from user "
                    + "'where user_id ='" +question.getUser_id();

    return jdbcTemplate.update(sql, new Object[] { question.getQuestion_id(),question.getQuestions(), question.getQuestion_text(), question.getUser_id()});
}

编辑: 这里是我用来测试该查询的junit测试类 打包qnaapp;

import org.junit.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;


import qnaapp.model.Login;
import qnaapp.model.User;
import qnaapp.model.Question;
import qnaapp.service.UserService;


 @RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = { "classpath:qna/config/user-beans.xml" })
public class UserServiceTest1 {
 @Autowired
  private UserService userService;

 @Test
  public void testValidateUser() {
    Login login = new Login();
    login.setUsername("krishnadubey");
    login.setPassword("123456789");

    User user = userService.validateUser(login);
    Assert.assertEquals("Krishna", user.getFirstname());
  }

  @Test
  public void testQuestion() {
    //User user = new User();
    Question question = new Question();
    question.setQuestion_id(4);
    
    question.setQuestions("Who is founder of c?");
    question.setQuestion_text("Please Explain");
    question.setUser_id(2);
  

    int result = userService.question(question);
    Assert.assertEquals(1, result);
  }
}

请为这些问题提出一些解决方案。

【问题讨论】:

  • SELECT(?,?,?,?) from user 'where user_id ='2 似乎不是有效的 SQL 合成器
  • 嘿@fantaghirocco 所以问号是我要插入需要插入的值的位置。我的sql查询是这样的-插入问题(question_id,questions,question_text,user_id)选择1作为question_id,“什么是java”作为问题,“请详细解释”作为question_text,user_id FROM user where user_id = 3;你可以在驱动文件中看到它。
  • 穆雷尼克的回答解释了它的问题

标签: java mysql spring


【解决方案1】:

你的sql写法有问题,试试下面的写法: 注意不要有多余的引号'和括号()

 public int question(Question question) {
        String sql = "insert into question (question_id,questions,question_text,user_id) 
 SELECT ?,?,?,? from user where user_id =" +question.getUser_id();

    return jdbcTemplate.update(sql, new Object[] { question.getQuestion_id(),question.getQuestions(), question.getQuestion_text(), question.getUser_id()});
}

【讨论】:

  • 嘿@RuneMage 感谢它的解决方案。请你再写一个查询。我有 Mysql 查询它在那里工作,但我无法为 spring 做它----插入答案( answer_id,answer_text,question_id,user_id) 选择 2 作为 answer_id,“它的 spring mvc 的一部分”作为 answer_text,question_id, us.user_id FROM question,user as us where question.question_id = 3 and us.user_id=4;
  • @Super MCU 类似上面的写法,你可以试试这个写法。另请注意:转义引号"String sql1 = "insert into answer ( answer_id,answer_text,question_id,user_id) SELECT 2 as answer_id, \"Its part of spring mvc\" as answer_text, question_id, us.user_id FROM question,user as us where question.question_id = "+question.getQuestion_id() + " and us.user_id= " + question.getUser_id();
  • public int answer(Answer answer) {String sql = "insert into answer (answer_id,answer_text,question_id,user_id) SELECT answer_id,answer_text,question_id,us.user_id FROM question,user as us where question .question_id ="+answer.getQuestion_id()+ " 和 us.user_id= " +answer.getUser_id(); return jdbcTemplate.update(sql, new Object[] { answer.getAnswer_id(), answer.getAnswer_text(), answer.getQuestion_id(),answer.getUser_id()});我已经在 spring mvc 中尝试了上述查询,但仍然给我一个错误。我试图改变 question.getQuestion_id 仍然没有工作。你能检查一下吗
  • 最好把所有的错误信息都贴出来。另外,这是jdbcTemplate的document
猜你喜欢
  • 1970-01-01
  • 2015-06-21
  • 1970-01-01
  • 2019-07-30
  • 1970-01-01
  • 2012-12-13
  • 1970-01-01
  • 1970-01-01
  • 2017-11-28
相关资源
最近更新 更多