【问题标题】:Spring Boot Data JPA NativeQuery throws Syntax-Error on Query working in MySQL WorkbenchSpring Boot Data JPA NativeQuery 在 MySQL Workbench 中的查询上抛出语法错误
【发布时间】:2020-09-22 16:14:34
【问题描述】:

我正在使用Spring Boot Data JPA 并想从我的 MySQL 数据库中查询数据。我在 MySQL 工作台中编写了一个查询,结果非常好,现在我想在我的存储库中使用该查询作为本机查询。

这是我的 MySQL Workbench 的查询:

SELECT s.* FROM fips.schedule s 
inner join lecture_object lo on s.id_lecture_object = lo.id_lecture_object 
inner join lecture_semester ls on lo.id_lecture_semester = ls.id_lecture_semester 
inner join lecture_semester_has_possible_lecturers ll on ls.id_lecture_semester = ll.id_lecture_semester
where s.id_scenario = 1 and ll.id_lecturer=103 and ll.status="fixed";

这是我的存储库中的行:

@Repository
public interface ScheduleRepository extends CrudRepository<Schedule, Integer> {

    @Query(value="SELECT s.* FROM fips.schedule s " +
            "inner join lecture_object lo on s.id_lecture_object = lo.id_lecture_object " +
            "inner join lecture_semester ls on lo.id_lecture_semester = ls.id_lecture_semester " +
            "inner join lecture_semester_has_possible_lecturers ll on ls.id_lecture_semester = ll.id_lecture_semester" +
            "where s.id_scenario = :scenarioId " +
            "and ll.id_lecturer = :lecturerId " +
            "and ll.status = \"fixed\"", nativeQuery = true)
    List<Schedule> getAllByFixedLecturerAndScenario(@Param("lecturerId") int lecturerId, @Param("scenarioId") int scenarioId);
}

现在执行时出现以下错误:

2020-09-22 18:02:15.607 DEBUG 7156 --- [nio-8081-exec-4] org.hibernate.SQL                        : SELECT s.* FROM fips.schedule s inner join lecture_object lo on s.id_lecture_object = lo.id_lecture_object inner join lecture_semester ls on lo.id_lecture_semester = ls.id_lecture_semester inner join lecture_semester_has_possible_lecturers ll on ls.id_lecture_semester = ll.id_lecture_semesterwhere s.id_scenario = ? and ll.id_lecturer = ? and ll.status = "fixed"
2020-09-22 18:02:15.608  WARN 7156 --- [nio-8081-exec-4] o.h.engine.jdbc.spi.SqlExceptionHelper   : SQL Error: 1064, SQLState: 42000
2020-09-22 18:02:15.608 ERROR 7156 --- [nio-8081-exec-4] o.h.engine.jdbc.spi.SqlExceptionHelper   : 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 's.id_scenario = 1 and ll.id_lecturer = 103 and ll.status = "fixed"' at line 1
2020-09-22 18:02:15.610 ERROR 7156 --- [nio-8081-exec-4] c.v.flow.server.DefaultErrorHandler      : 
could not extract ResultSet; SQL [n/a]; nested exception is org.hibernate.exception.SQLGrammarException: could not extract ResultSet

WHERE-clause 似乎有问题,但它与 MySQL WB 中的语句完全相同。我在本机查询中遗漏了什么吗?我还尝试将fixed 周围的" 更改为',这并没有改变结果(将status = "fixed" 替换为status LIKE "fixed" 也是如此。

【问题讨论】:

  • 当把“fixed”改成“fixed”时,你是否也去掉了\转义符?
  • 是的,它说status = 'fixed' - 我还删除了 where 语句的那部分以检查这是否可能是问题,结果没有改变。
  • 是否可以选择使用存储过程?否则我必须通过,对不起。

标签: java mysql spring spring-boot jpa


【解决方案1】:

字符串末尾的“where”之前需要一个空格。改变

on ls.id_lecture_semester = ll.id_lecture_semester"

on ls.id_lecture_semester = ll.id_lecture_semester "

【讨论】:

  • 另外最好列出列名,例如s.column1, s.column2,..., 在 SELECT 而不是 s.*
  • 这有点尴尬,真的修复了它:D 如果数据库表上的某些内容发生更改(例如添加了一个标志 - 你'基本上必须调整所有查询)?或者列出属性比s.*有什么好处
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-01-21
  • 2018-12-12
  • 1970-01-01
  • 2014-02-15
  • 2017-07-04
  • 2011-04-19
  • 1970-01-01
相关资源
最近更新 更多